首页 > 解决方案 > 为什么 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))

为什么它会忽略约束并允许这样的代码编译?有没有办法强制执行约束?

标签: typescript

解决方案


这是因为:(key: K) => R是一个子类型,(key: K, default_value: D) => R所以前者的实例可以分配给后者类型。请参阅比较两个函数。当这个赋值发生时,它基本上意味着忽略传递给函数的额外参数,这在 javascript 中很常见


推荐阅读