据我所知,Typescript中的--strictFunctionTypes
编译器选项阻止了一个非常常见的多态性用例:
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
阻止的那种错误。如果签名中的参数是基类型,而实现需要派生类型,则无法保证实现将接收派生类型,因为签名仅需要传入基类型