![](/img/trans.png)
[英]Typescript Why this recursive map type does not satisfy the constraint?
[英]Why does TypeScript ignore the type constraint?
我們定義了get(o, key, default_value)
function,它應該與滿足{ get: (key: K, default_value: D) => R }
接口的任何 Object 一起使用。
TypeScript 應該驗證只有這樣的對象才能傳遞給get
function。
但它也允許傳遞{ get: (key: K) => R }
object,這是錯誤的。
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
的子類型,因此可以將前者的實例分配給后者。 請參閱比較兩個函數。 當這個賦值發生時,它基本上意味着忽略傳遞給 function 的額外參數,這在 javascript 中很常見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.