据我所知,typescript中的编译器选项阻止了多态性的一个非常常见的用例:

type Handler = (request: Request) => Response

const myHandler: Handler = (request: Request & { extraArg: boolean }) => {
  return !!request.extraArg
}

一般来说,我认为--strictFunctionTypes系列中的所有编译器选项都有一些很大的好处,但在本例中,我看到的只是它阻止了非常逻辑的行为工作。
那么,在哪些情况下,这种选择实际上会带来一些好处呢?它能防止哪些有害的情况?

最佳答案

如果没有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防止的错误类型。如果签名中的参数是基类型,而实现需要派生类型,则无法保证实现将接收派生类型,因为签名只要求传入基类型

关于typescript - 在Typescript中使用'--strictFunctionTypes'有什么好处?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51767338/

10-11 14:17