當我這樣做時:
interface I<T extends Record<string, {b: boolean}>> {
x: T[keyof T]['b'];
}
一切正常,但是一旦我更改string為number,我就會得到ts(2536): Type 'b' cannot be used to index type 'T[keyof T]'. 這是為什么?
uj5u.com熱心網友回復:
我相信這種行為的原因是它Record<number, any>也接受陣列型別。
做I<{b: boolean}[]>正確編譯。但是keyof在陣列型別上使用也將包括許多其他屬性,例如lengthor 方法鍵,例如pop()or push()。因此,當您這樣做時T[keyof T],您還將獲得這些屬性的型別。
type ArrayValueof = {b: boolean}[][keyof []]
// type ArrayValueof = number | {
// b: boolean;
// } | (() => IterableIterator<{
// b: boolean;
// }>) | (() => {
// copyWithin: boolean;
// entries: boolean;
// fill: boolean;
// find: boolean;
// findIndex: boolean;
// keys: boolean;
// values: boolean;
// }) | ... 28 more ... | ((searchElement: {
// b: boolean;
// }, fromIndex?: number | undefined) => boolean)
如您所見,{ b: boolean }是此聯合的一部分,但并非此聯合中的每個元素都是具有屬性的物件b。這就是為什么你不能使用"b"索引T[keyof T]whenT也可能是一個陣列。
操場
您可以通過使用附加檢查來解決此問題:
interface I<T extends Record<number, {b: boolean}>> {
x: T[T extends any[] ? number : keyof T]["b"];
}
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495753.html
下一篇:如何回傳一個空的引數化類Box?
