首页 > 解决方案 > Typescript 接口属性作为类型化函数参数未强制执行

问题描述

我有这个界面:

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

const field: Field = {
  type: 'text',
  value: () => 'Hello'
};

为什么打字稿不强制执行argument1and argument2?这段代码编译没有问题,我希望打字稿确保函数与我在接口定义中键入的完全一样。

标签: typescript

解决方案


为什么打字稿不强制执行argument1和argument2?

类型的目的是强制在调用函数时必须传入这些参数。类型并不意味着函数必须对这些参数做任何事情。编写如下所示的函数是合法的,它列出了参数,然后对它们不做任何事情:

value: (argument1: string, argument2: string) => 'Hello'

这是额外的输入,但没有任何好处,因为 javascript 函数可以采用任意数量的参数,而不管列出了哪些参数。所以打字稿也让你不必费心列出它们,同时仍然与类型兼容。如果您列出类型不匹配的参数,它会告诉您,但省略不是问题。

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

您可能想知道为什么我们允许像示例 y = x 中那样“丢弃”参数。允许这种赋值的原因是忽略额外的函数参数实际上在 JavaScript 中很常见。例如,Array#forEach 为回调函数提供了三个参数:数组元素、其索引和包含数组。尽管如此,提供只使用第一个参数的回调非常有用:

let items = [1, 2, 3];

// Don't force these extra parameters
items.forEach((item, index, array) => console.log(item));

// Should be OK!
items.forEach(item => console.log(item));

推荐阅读