我有这个界面:
interface Field {
type: string;
value: (argument1: string, argument2: string) => string;
}
const field: Field = {
type: 'text',
value: () => 'Hello'
};
为什么打字稿不强制使用argument1
和argument2
?这段代码编译没有问题,我希望打字稿确保该功能与我在接口定义中键入的功能完全相同。
答案 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));