Typescript接口属性作为键入函数参数未强制执行

时间:2020-07-05 00:30:16

标签: typescript

我有这个界面:

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

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

为什么打字稿不强制使用argument1argument2?这段代码编译没有问题,我希望打字稿确保该功能与我在接口定义中键入的功能完全相同。

1 个答案:

答案 0 :(得分:4)

为什么打字稿不强制使用argument1和argument2?

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

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

这是没有好处的额外键入,因为javascript函数可以采用任意数量的参数,而与列出的参数无关。因此,打字稿还可以让您不必打扰列出它们,同时仍与该类型兼容。如果您列出的参数类型不匹配,它将告诉您,但是省略不是问题。

Typescript是故意设计的。请参阅文档的这一部分: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));
相关问题