升級庫后遇到打字問題。這是錯誤的提煉形式:
class Bar {
id: string = '';
}
declare type ExcludeFunctions<T, K extends keyof T> = T[K] extends Function ? never : (K extends symbol ? never : K);
declare type Baz<T> = {
[K in keyof T as ExcludeFunctions<T, K>]?: T[K];
};
class Base<T extends Bar> {
public async foo(input: Baz<T>) {
//Property 'id' does not exist on type 'Baz<T>'.
input.id = 'x';
}
}
為什么 Baz 沒有屬性“id”?看起來“字串擴展函式”的計算結果為真,因為當我洗掉這個條件時,錯誤消失了。但是字串顯然沒有擴展函式。這里發生了什么?
uj5u.com熱心網友回復:
我相當確定這是泛型的限制,并且當您說Tin Base<T>must extend時您會失去背景關系Bar。當您將泛型傳遞給 時Baz,它使用的是映射型別,因此它無法通過Bar部分進行計算,T因為T可能是擴展的任何內容Bar。input您可以通過將型別更改為專門計算Baz<Bar>來修復此錯誤Baz<T> & Baz<Bar>:
class Bar {
id: string = '';
}
type Baz<T> = {
[K in keyof T as T[K] extends Function ? never : K]?: T[K];
};
class Base<T extends Bar> {
public async foo(input: Baz<T> & Baz<Bar>) {
type Debug = Baz<T>;
// ^? type Debug = { [K in keyof T as T[K] extends Function ? never : K]?: T[K] | undefined; }
input.id = 'x'; // no error!
}
}
還要注意 howBaz<T & Bar>不起作用,因為這與說Baz<T>because Tmust extend是一樣的Bar。
PS你不應該使用declare type型別已經在環境背景關系中。
TypeScript Playground 鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/439039.html
上一篇:鍵入Object.fromEntries(newFormData(form))
下一篇:打字稿雙回傳型別物件檢查
