[英]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 {
}
由於exampleFn
將ActionTypes
的所有可能性視為T
,因此U
用此類擴展ActionPayloads[T]
。 如果在ActionPayloads
中省略了T
的任何可能性,則T
不能用於索引ActionPayloads
。 這就是錯誤消息所說的。
好吧,我想通了。 我的枚舉比示例大很多,其中有一個條目未在有效負載類型中考慮。
這整件事是由不匹配引起的; 它工作正常。
長話短說,錯誤消息並沒有真正提供使用信息,並確保您的 enum 和 type 中的密鑰對齊。 在這里浪費了很多時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.