簡體   English   中英

Typescript function arguments 基於以枚舉為鍵的類型

[英]Typescript function arguments based on types with enums as keys

假設我有一個帶有一組動作類型的枚舉:

export enum ActionTypes {
  action1 = 'action1',
  action2 = 'action2',
  action3 = 'action3',
  // ...etc
}

我有一組有效負載類型,function 在執行該操作時需要這些類型,這些類型與操作類型本身無關:

export type ActionPayloads = {
  [ActionTypes.action1]: boolean,
  [ActionTypes.action2]: string,
  [ActionTypes.action3]: void,
  // ...etc
}

我想使用一個 function 作為它的第一個參數來自枚舉的動作類型,然后使用 TS 提示讓它推斷參數二的有效負載類型:

function exampleFn<T extends ActionTypes, U extends ActionPayloads[T]> (type: T, data?: U): void {
  //...
}

我覺得這可行,但即使我將 ActionPayloads 更改為接口,在這兩種情況下U extends ActionPayloads[T]我都會收到錯誤TS2536: Type 'T' cannot be used to index type 'ActionPayloads'

我在這里錯過了什么嗎? 我覺得這應該可行,因為枚舉的使用沒有什么特別的。

更新以重現錯誤

可以通過從ActionPayloads中省略任何可能的ActionTypes來重現該錯誤。

export enum ActionTypes {
  action1 = "action1",
  action2 = "action2",
  action3 = "action3",
  // ...etc
}

export type ActionPayloads = {
  [ActionTypes.action1]: boolean;
  // [ActionTypes.action2]: string; // accidentally omit action2
  [ActionTypes.action3]: void;
  // ...etc
}

function exampleFn<T extends ActionTypes, U extends ActionPayloads[T]>(type: T, data?: U): void {

}

由於exampleFnActionTypes的所有可能性視為T ,因此U用此類擴展ActionPayloads[T] 如果在ActionPayloads中省略了T的任何可能性,則T不能用於索引ActionPayloads 這就是錯誤消息所說的。

好吧,我想通了。 我的枚舉比示例大很多,其中有一個條目未在有效負載類型中考慮。

這整件事是由不匹配引起的; 它工作正常。

長話短說,錯誤消息並沒有真正提供使用信息,並確保您的 enum 和 type 中的密鑰對齊。 在這里浪費了很多時間。

暫無
暫無

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

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