typescript - Typescript 接口属性作为类型化函数参数未强制执行
问题描述
我有这个界面:
interface Field {
type: string;
value: (argument1: string, argument2: string) => string;
}
const field: Field = {
type: 'text',
value: () => 'Hello'
};
为什么打字稿不强制执行argument1
and argument2
?这段代码编译没有问题,我希望打字稿确保函数与我在接口定义中键入的完全一样。
解决方案
为什么打字稿不强制执行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));
推荐阅读
- java - 为什么要使用 Consumer 和 Producer 而不是普通的 getter/setter?
- c# - 使用 DI 在 Startup.cs 中访问 NPGSQL
- shell - 在 shell 脚本中使用 "set --" 会导致 "bad number"
- regex - 我无法从未使用的运算符中删除零
- python - 在 Python 中使用时间戳重命名将文件移动到子目录
- java - jdk版本如何决定——Oracle发布周期更短
- groovy - 在groovy中映射,如何从键中获取值?
- php - 我可以从 mysql 表中获取值并将其设置为变量吗?
- qt - Qt Installer Framework - 防止安装在非空文件夹中
- sql - 在 sybase 中,如何锁定正在执行的存储过程并更改存储过程返回的表?