javascript - 即使参数的类型错误,TypeScript 也不会出错
问题描述
我有一个将字典作为第一个参数的函数。这个字典有字符串作为键,函数作为值。问题是,如果字典中的函数签名错误,TypeScript 不会抱怨!
一段代码值 1000 字。这是我的main.ts
:
interface MyMap {
[key: string]: (x: number) => void;
}
function f(map: MyMap, key: string, x: number) : void{
map.hasOwnProperty(key) ? map[key](x) : console.log(x)
}
const stupidMap: MyMap = {
'square': (x) => {
console.log(x*x);
return x*x; // This function should return void!!
},
'double': (x) => {
console.log(x+x);
}
}
f(stupidMap, 'square', 5) // Prints 25
f(stupidMap, 'double', 5) // Prints 10
我用 编译它tsc main.ts
,我没有任何错误。tsc --version
打印Version 3.7.2
。我有两个问题:
- 为什么我没有收到任何错误?
- 我是否遗漏了一些会导致出现此错误的编译标志?
任何见解将不胜感激。谢谢!
解决方案
没有问题,因为(x: number) => void
可分配给(x: number) => number
. 这是一个证明:
type F = (x: number) => void
type Z = (x: number) => number
type ZextendsF = Z extends F ? true : false // evaluate to true
这个事实对于程序流程来说是完全没问题的。如果你的界面说 - 我需要一个不返回的函数,那么如果我传递一个返回某些东西的函数,那完全没问题,因为我永远不会使用这个返回数据。它是类型安全的,无需担心。
有关功能可分配性的更多详细信息 -比较两个功能。还有更多关于 TypeScript 类型行为和关系类型可分配性的详细信息。
推荐阅读
- python - 如何将自定义包中的模块正确导入 AWS Lambda 函数?
- haskell - 从haskell中的char和int [([Char], Int)]列表中输出一个字符串列表([String])
- c - 如何将时间输入到结构中?
- html - 仅悬停覆盖图像上的 Bootstrap 4 卡
- django - 如何提高 PDF 文件(Django)的渲染时间?
- javascript - 将提交的表单转换为表单数据对象
- pandas - 如何使用 PIL 从 pandas 数据框中的行值创建图像?
- javascript - 如何减小图片的大小并将其变成视差效果?
- python - 如何将电报频道中的消息保存为变量
- python - 试图从 MySQL 获取数据