簡體   English   中英

一種字段類型受第二個字段中指定的鍵名約束的通用類型

[英]Generic type where one field type is constraint by key name specified in second field

假設我有這種類型

type Form = {
  enabled: true;
  name: string;
};

我想制作另一種表示特定字段的更改事件的泛型類型

type ChangeEvent<T> = {
  field: keyof T;
  value: T[keyof T];
};

上面的例子沒有正確約束value

const e: ChangeEvent<Form> = {
  field: "enabled",
  value: "false", // accepts boolean or string
}

我知道映射類型

type ChangeEvent<T> = {
  [K in keyof T]: T[K];
}

但我想知道如何將它與單獨的value字段一起使用。

我也不想指定第二個通用參數,例如

type ChangeEvent<T, K extends keyof T> = {
  field: K;
  value: T[K];
}

如何修復ChangeEvent的第一個版本?

如果我錯了並且這不是公認的答案,我會很高興,但是我很確定您目前可以做的絕對最好的事情是:

type KChangeEvent<T, K extends keyof T = keyof T> = {
  field: K;
  value: T[K];
}

export type ChangeEvent<T> = KChangeEvent<T>

因此它在技術上具有第二個類型參數,但導出的類型關閉了keyof T默認值。

但最終,必須命名K ,因為這是讓 TypeScript 在多個位置約束同一類型的唯一方法。 keyof T沒有削減它,因為每個引用都可能是不同的類型。

暫無
暫無

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

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