作者:陈政德169384 | 来源:互联网 | 2022-12-08 11:18
据我了解,--strictFunctionTypes
Typescript中的编译器选项阻止了一个非常常见的多态用例的工作:
type Handler = (request: Request) => Response
const myHandler: Handler = (request: Request & { extraArg: boolean }) => {
return !!request.extraArg
}
通常,我假设该系列中的所有编译器选项strict
都具有很大的好处,但是在这种情况下,我所看到的只是它阻止了非常逻辑的行为。
那么,在什么情况下此选项实际上可以带来一些好处呢?它可以防止哪些有害情况?
1> Titian Cerni..:
不带引起运行时错误实际上很容易strictFunctionTypes
。
让我们考虑以下示例:
type Handler = (request: Request) => Response
const myHandler: Handler = (request: Request & { extraArg: string }) => {
// extraArg is required so need to check for null
request.extraArg.toUpperCase();
return null as any;
}
declare let r: Request; // comes from sowhere
myHandler(r); // no need to pass in the extraArg not required by the signature
因此,在上面的示例中,函数签名需要一个Request
,这就是我们必须传递的所有内容Request
。但执行期望接收Request & { extraArg: string }
中extraArg
是必需的,并获得它,而无需做一次检查(如果一切后,它需要调用应该过去了吧)。
这是strictFunctionTypes
防止错误的一种。如果签名中的参数是基本类型,而实现需要一个派生类型,则不能保证实现将接收派生类型,因为签名仅要求传入基本类型。