Typescript 接口属性作为类型化函数参数没有被强制执行

Him*_*mad 3 typescript

我有这个界面:

interface Field {
  type: string;
  value: (argument1: string, argument2: string) => string;
}

const field: Field = {
  type: 'text',
  value: () => 'Hello'
};
Run Code Online (Sandbox Code Playgroud)

为什么 typescript 不强制执行argument1and argument2?这段代码编译没有问题,我想要打字稿来确保该函数与我在接口定义中键入的完全相同。

Nic*_*wer 5

\n

为什么 typescript 不强制执行 argument1 和 argument2?

\n
\n

该类型的目的是强制要求在调用函数时必须传入这些参数。尽管该类型并不意味着函数必须对这些参数执行任何操作。编写如下所示的函数是合法的,该函数列出了参数,然后对它们不执行任何操作:

\n
value: (argument1: string, argument2: string) => \'Hello\'\n
Run Code Online (Sandbox Code Playgroud)\n

但这是没有任何好处的额外输入,因为无论列出哪些参数,JavaScript 函数都可以采用任意数量的参数。因此,Typescript 还可以让您不必费心列出它们,同时仍然与类型兼容。如果您列出的参数的类型不匹配,它会告诉您,但省略不是问题。

\n

Typescript 是故意这样设计的。请参阅文档的这一部分:https ://www.typescriptlang.org/docs/handbook/type-compatibility.html#comparing-two-functions

\n
\n

您可能想知道为什么我们允许 \xe2\x80\x98discarding\xe2\x80\x99 参数,如示例 y = x 中所示。允许这种分配的原因是忽略额外的函数参数实际上在 JavaScript 中很常见。例如,Array#forEach 向回调函数提供三个参数:数组元素、其索引以及包含的数组。尽管如此,提供仅使用第一个参数的回调非常有用:

\n
let items = [1, 2, 3];\n\n// Don\'t force these extra parameters\nitems.forEach((item, index, array) => console.log(item));\n\n// Should be OK!\nitems.forEach(item => console.log(item));\n
Run Code Online (Sandbox Code Playgroud)\n
\n