据我了解,--strictFunctionTypes
Typescript 中的编译器选项阻止了一个非常常见的多态性用例的工作:
type Handler = (request: Request) => Response
const myHandler: Handler = (request: Request & { extraArg: boolean }) => {
return !!request.extraArg
}
一般来说,我假设所有编译器选项strict
家庭有一些很大的好处,但在这种情况下,我所看到的只是它阻止了非常合乎逻辑的行为的发挥。
那么在什么情况下这个选项实际上能带来一些好处呢?它可以防止哪些有害情况?
实际上很容易导致运行时错误而不需要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
防止。如果签名中的参数是基类型,而实现需要派生类型,则不能保证实现将接收派生类型,因为签名只需要传入基类型
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)