gpt4 book ai didi

typescript - 为什么 TypeScript 不强制执行接口(interface)签名?

转载 作者:行者123 更新时间:2023-12-04 14:47:13 25 4
gpt4 key购买 nike

所以,我有以下界面:

interface DoStuffInterface {
doStuff(value: string | number): string | number;
}
为什么在实现这个接口(interface)时 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有正确的签名吗?如果签名被正确设置,这将是一个编译时错误,而不是你得到一个运行时错误。
我错过了一些配置标志吗?或者这是预期的行为?
Here the full example

最佳答案

TLDR 启用所需的行为更改方法到属性:

interface DoStuffInterface {
doStuff: (value: string | number) => string | number;
}
Playground

对于 strictFunctionTypes 下的接口(interface)函数类型参数位置被逆变检查(对于“函数 Prop ”)而不是双变(对于方法)

The stricter checking applies to all function types, except those originating in method or constructor declarations. Methods are excluded specifically to ensure generic classes and interfaces (such as Array<T>) continue to mostly relate covariantly.

关于typescript - 为什么 TypeScript 不强制执行接口(interface)签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69807243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com