typescript - 为什么 TypeScript 会忽略类型约束?
问题描述
我们定义了get(o, key, default_value)
应该与满足{ get: (key: K, default_value: D) => R }
接口的任何对象一起使用的函数。
TypeScript 应该验证只有这样的对象才能传递给get
函数。
但它也允许传递一个{ get: (key: K) => R }
对象,这是错误的。
function get<K, D, R>(
o: { get: (key: K, default_value: D) => R }, key: K, dvalue: D
): R {
return o.get(key, dvalue);
}
class Params {
constructor(public values: { [key: string]: number }) { }
get(key: string): number | undefined {
return this.values[key]
}
}
const params = new Params({ a: 10 });
console.log(get(params, "a", 5))
为什么它会忽略约束并允许这样的代码编译?有没有办法强制执行约束?
解决方案
这是因为:(key: K) => R
是一个子类型,(key: K, default_value: D) => R
所以前者的实例可以分配给后者类型。请参阅比较两个函数。当这个赋值发生时,它基本上意味着忽略传递给函数的额外参数,这在 javascript 中很常见。
推荐阅读
- java - 在 Android Studio 中迁移到 AndroidX 后出现 YoutubeAndroidPlayerAPI 错误
- ios - iOS - CGImage 裁剪旋转矩形
- linux - linux数据包传输时间戳
- react-native - 在有天赋的聊天中显示图像或视频
- javascript - 导入的 React 组件有一个不需要的宽度:0 div 在根并且正在停止组件填充父 CSS 网格区域
- c# - plsql:替换 C# 中调用的 15 行 SELECT 查询?
- cross-compiling - 如何指定主机参数以在 Bazel 中配置脚本?
- docker-compose - Docker - 从容器调用主机 API 端点 (localhost)。主机名是无效的 HttpCode 400 错误
- swift - 无法根据检查挂钩到另一个 RxSwift 流
- docker - 在不同主机上使用带有 docker 的 nodemon 的问题