這個問題在這里已經有了答案: 意外的工會分布 1 個回答 1 小時前關閉。
我一直在嘗試撰寫一個泛型型別,它可以采用可選引數來根據另一個類似型別重新映射哪些鍵。
我的問題是 Typescript 似乎不喜歡這個。這是設定:
interface Origin {
a: string;
b: string;
}
interface SimiliarType {
a: boolean;
b: boolean;
}
type Mapped<K extends keyof Origin> = Omit<Origin, K> & {
[Property in K]: SimiliarType[Property];
};
const mapped: Mapped<'b'> = { a: '', b: false };
// OK
const mapped: Mapped<'a' | 'b'> = { a: false, b: false };
// OK
上面的代碼按預期作業,但添加條件似乎改變了原來的行為:
type ConditionalMapped<K extends keyof Origin | undefined = undefined> = K extends keyof Origin
? Mapped<K>
: Origin;
const conditionalMapped1: ConditionalMapped = { a: '', b: '' };
// OK
const conditionalMapped2: ConditionalMapped<'b'> = { a: '', b: false };
// OK
const conditionalMapped3: ConditionalMapped<'a' | 'b'> = { a: false, b: false };
// ERROR: b is not a string
據我所知,這似乎是打字稿的一個限制,但我可能是錯的。我可以為每個條件創建不同的型別,但如果有辦法將它們組合起來,我寧愿不這樣做。
uj5u.com熱心網友回復:
您遇到了條件型別的分配行為。
這種行為意味著在實體化型別時ConditionalMapped<'a' | 'b'>,結果將是Mapped<"b"> | Mapped<"a">而不是Mapped<"b" | "a">。
簡單的解決方案是禁用分發行為。由于這種行為只發生在裸型別引數上,我們可以將型別引數包裝在一個元組中:
type ConditionalMapped<K extends keyof Origin | undefined = undefined> = [K] extends [keyof Origin]
? Mapped<K>
: Origin;
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533286.html
下一篇:更改HookonClick中的值
