![](/img/trans.png)
[英]Convert a dynamic json object into generics type in typescript
[英]Typescript - Dynamic Generics Type
我不知道到底該怎么稱呼這個問題,但這是我的情況。
我希望defaultValue
根據id
值自動獲取類型。
type User = {
name: string;
age: number;
};
type PropConfig<T, K extends keyof T> = {
id: K;
label: string;
defaultValue: T[K];
};
const config: PropConfig<User, 'age'> = {
id: 'age',
label: 'Age',
defaultValue: 18,
};
這就是我要的:
type PropConfig<T, K = keyof T> = {
id: K;
label: string;
defaultValue: T[K]; // Error here
};
const config: PropConfig<User> = {
id: 'age',
label: 'Age',
defaultValue: 18,
};
有人能幫我嗎?
TypeScript 沒有ms/TS#26242中建議的部分類型參數推斷,因此在讓編譯器推斷K
時無法指定T
,至少在沒有涉及柯里化輔助函數或虛擬參數的解決方法的情況下(參見Typescript:推斷類型可選的第一個泛型之后的泛型以獲取更多信息)。
幸運的是,我不認為您希望PropConfig
在K
中是通用的。 相反,您希望PropConfig<T>
成為keyof T
中每個K
的可能類型的聯合。 也就是說,您希望在keyof T
的聯合中分配類型。 有很多方法可以做到這一點,但我通常做的一種是創建所謂的分布式對象類型,正如在ms/TS#47109中創造的那樣。 它看起來像這樣:
type PropConfig<T> = { [K in keyof T]-?: {
id: K;
label: string;
defaultValue: T[K];
} }[keyof T]
我立即索引到映射類型,為PropConfig<User>
生成以下內容:
type PropConfigUser = PropConfig<User>;
/* type PropConfigUser = {
id: "name";
label: string;
defaultValue: string;
} | {
id: "age";
label: string;
defaultValue: number;
} */
這是您想要的類型:
const config: PropConfig<User> = {
id: 'age',
label: 'Age',
defaultValue: 18,
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.