typescript - 为什么 TypeScript 不强制执行接口签名?
问题描述
所以,我有以下界面:
interface DoStuffInterface {
doStuff(value: string | number): string | number;
}
为什么在实现此接口时 TS 不强制执行签名?
class NumberStuff implements DoStuffInterface {
public doStuff(value: number): string | number { // <====== missing: | string
return value;
}
}
class StringStuff implements DoStuffInterface {
public doStuff(value: string): string | number { // <====== missing: | number
return value.toLowerCase();
}
}
这很容易被这样的东西打破:
var numberStuff = new NumberStuff();
var stringStuff = new StringStuff();
function run(thing: DoStuffInterface): void {
console.log(thing.doStuff(42));
}
run(numberStuff);
run(stringStuff); // <====== this fails, due to: `42.toLowerCase()`
那么,为什么 TS 不强制NumberStuff
&StringStuff
拥有正确的签名呢?如果签名设置正确,这将是一个编译时错误,而您会得到一个运行时错误。
我错过了一些配置标志吗?还是预期的行为?
解决方案
TLDR 为属性启用所需的行为更改方法:
interface DoStuffInterface {
doStuff: (value: string | number) => string | number;
}
对于strictFunctionTypes下的接口,函数类型参数位置是逆变检查的(对于“function prop”)而不是双变量检查(对于方法)
更严格的检查适用于所有函数类型,但源自方法或构造函数声明的函数类型除外。方法被专门排除以确保泛型类和接口(例如
Array<T>
)继续大部分协变相关。
推荐阅读
- c++ - 这个正则表达式有什么问题?smatch 的后缀始终为空
- kotlin - TornadoFX (JavaFX):当视图变得可见时如何执行操作
- python - Django:从 URL 加载图像(不是静态文件)
- java - 条件选择返回集合而不是列表。如何修复该错误?
- nginx - docker中的plantuml,gitlab nginx配置不起作用
- text - 在 MTurk 的页面上多次点击
- c - Rust ffi + wasm (yew -> cargo web start) -> 致命错误:'math.h' 文件未找到
- python - 值错误:无法将字符串转换为浮点数。用 Pandas 打开 CSV 文件
- wordpress - 古腾堡区块验证失败
- firebase - Firestore 查询结果问题(有时结果包含连续的文档,有时是不相关的结果)