所以,我正在学习打字但是我不明白这些参数是如何工作的
interface MyInterface {
(name?: string): any;
new (name?: string): any;
}
class MyClass implements MyInterface {
(name?: string): any; // This is not working
}
我的理解: name
应该是一个字符串参数,而不是强制性的
我不明白的是:在any
之外是如何工作的?new name
是什么意思?
来源:OutputDecorator的Angular核心文档:
分别是呼叫签名和构造签名。
任何你定义的类型为MyInterface
的都可以是
- 调用,可选地使用
string
参数。 - 构造(
new
-ed),可选地带有string
参数。
在这两种情况下,调用new
或调用MyInterface
都会得到类型为any
的值。
对于这个:
class MyClass implements MyInterface {
(name?: string): any; // This is not working
}
根据TypeScript规范,调用或构造签名只能出现在TypeBody中,类型主体只能在对象类型文字和接口声明中使用。这与ClassBody不允许调用/构造签名有微妙的不同。
在类中,可以定义构造函数:
class C {
constructor() {
console.log("Hi");
}
}
但是没有办法使一个类可调用。
请注意,使用调用和构造签名实现某些东西意味着实例将获得类型,而不是静态端。换句话说,你说MyClass
产生的东西将与MyInterface
兼容,但没有提到MyClass
本身的静态形状。
现在没有办法确保静态侧具有特定的形状,除非像这样的hack:
class MyClass {
// ...
}
if (!!false) {
let x: MyInterface = MyClass;
}