簡體   English   中英

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:推斷類型可選的第一個泛型之后的泛型以獲取更多信息)。

幸運的是,我不認為您希望PropConfigK通用的。 相反,您希望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,
};

Playground 代碼鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM