我只是想在typescript接口中声明一个静态属性?我没有找到任何关于这方面的资料。
interface myInterface {
static Name:string;
}
这可能吗?
我只是想在typescript接口中声明一个静态属性?我没有找到任何关于这方面的资料。
interface myInterface {
static Name:string;
}
这可能吗?
当前回答
可以使用相同的名称将接口和命名空间合并:
interface myInterface { }
namespace myInterface {
Name:string;
}
但是这个接口只有知道它的属性Name才有用。你不能实现它。
其他回答
我执行了一个类似Kamil sot的解决方案,但却产生了意想不到的效果。我没有足够的声誉来发表这条评论,所以我把它贴在这里,以防有人正在尝试这个解决方案并阅读这篇文章。
解决方案是:
interface MyInterface {
Name: string;
}
const MyClass = class {
static Name: string;
};
但是,使用类表达式不允许我使用MyClass作为类型。如果我这样写:
const myInstance: MyClass;
myInstance的类型是any,我的编辑器显示以下错误:
'MyClass' refers to a value, but is being used as a type here. Did you mean 'typeof MyClass'?ts(2749)
我最终失去了一个比我想通过类的静态部分的接口实现的更重要的类型。
瓦尔使用装饰器的解决方案避免了这个陷阱。
静态属性通常放在对象的(全局)构造函数上,而“interface”关键字适用于对象的实例。
如果你用TypeScript编写类,前面给出的答案当然是正确的。如果你描述的是一个已经在其他地方实现的对象,那么包含静态属性的全局构造函数可以这样声明:
declare var myInterface : {
new(): Interface;
Name:string;
}
遵循@Duncan的@Bartvds的回答,在这里提供了一个可行的方法。
在Typescript 1.5发布后(@Jun 15 '15),你的有用界面
interface MyType {
instanceMethod();
}
interface MyTypeStatic {
new():MyType;
staticMethod();
}
可以在decorator的帮助下以这种方式实现。
/* class decorator */
function staticImplements<T>() {
return <U extends T>(constructor: U) => {constructor};
}
@staticImplements<MyTypeStatic>() /* this statement implements both normal interface & static interface */
class MyTypeClass { /* implements MyType { */ /* so this become optional not required */
public static staticMethod() {}
instanceMethod() {}
}
参考我在github issue 13462的评论。
视觉效果: 编译错误,提示缺少静态方法。
静态方法实现后,提示方法缺失。
在静态接口和正常接口完成后进行编译。
如果您正在寻找定义一个静态类(即。所有的方法/属性都是静态的),你可以这样做:
interface MyStaticClassInterface {
foo():string;
}
var myStaticClass:MyStaticClassInterface = {
foo() {
return 'bar';
}
};
在这种情况下,静态“类”实际上只是一个普通的-ol'-js-object,它实现了MyStaticClassInterface的所有方法
这里没有提到的另一个选项是用表示静态接口的类型定义变量,并为其分配类表达式:
interface MyType {
instanceMethod(): void;
}
interface MyTypeStatic {
new(): MyType;
staticMethod(): void;
}
// ok
const MyTypeClass: MyTypeStatic = class MyTypeClass {
public static staticMethod() { }
instanceMethod() { }
}
// error: 'instanceMethod' is missing
const MyTypeClass1: MyTypeStatic = class MyTypeClass {
public static staticMethod() { }
}
// error: 'staticMethod' is missing
const MyTypeClass2: MyTypeStatic = class MyTypeClass {
instanceMethod() { }
}
效果与使用装饰器的应答相同,但没有装饰器的开销
操场上
GitHub上的相关建议/讨论