Jen*_*tke 13 properties interface function typescript
有人可以解释一下,为什么在这段代码中对 InterfaceA 类型的常量赋值有效,但对 InterfaceB 类型的常量赋值会引发错误:
interface InterfaceA {
doSomething (data: object): boolean;
}
interface InterfaceB {
doSomething: (data: object) => boolean;
}
function doIt (data: { type: string; }): boolean {
return true;
}
const A: InterfaceA = {
doSomething: doIt
};
const B: InterfaceB = {
doSomething: doIt
};
Run Code Online (Sandbox Code Playgroud)
对我来说,两个接口的定义相同,只是符号不同。
如果这不是 TypeScript 中的错误,并且有真正的原因,那么让我们来回答我的第二个问题:我需要指定,“doSomething”是可选的,可以是函数,也可以是 RegExp:
interface InterfaceB {
doSomething?: ((data: object) => boolean) | RegExp;
}`
Run Code Online (Sandbox Code Playgroud)
我怎么能用InterfaceA的符号实现这一点?
for*_*d04 18
1.)方法和函数属性声明的区别:
interface InterfaceA {
doSomething(data: object): boolean; // method declaration
}
interface InterfaceB {
doSomething: (data: object) => boolean; // function as property declaration
}
Run Code Online (Sandbox Code Playgroud)
2.) TypeScript 2.6为强类型、健全的函数类型引入了编译器标志:
在
--strictFunctionTypes
函数类型下,参数位置被逆变而不是双变量检查。在严格的检查适用于所有类型的函数,除了那些原产于方法或构造函数声明。(我的重点)
所以总的来说,这是一件好事。在您的示例中,InterfaceB
具有以下合同:“可以处理将军的每个功能object
都是兼容的”。但是您想分配一个函数doIt
,该函数需要特定类型的对象{ type: string; }
作为输入。使用的客户端InterfaceB
认为,通过 就足够了object
,但是实现需要doIt
更具体的东西,所以你理所当然地得到那个错误。
InterfaceA
?相比之下,方法就像doIt
在InterfaceA
被排除从--strictFunctionTypes
实际原因。开发人员决定类型系统不要太依赖于内置方法Array
等,以便在正确性和生产力之间取得合理的平衡。
因此,为了支持更强的类型,我更喜欢以下类型,它适用于您的情况(示例):
interface InterfaceB {
doSomething: ((data: { type: string; }) => boolean) | RegExp;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9657 次 |
最近记录: |