我想做一些這樣的型別映射:
有一些帶有idand的模塊actions,我想結合所有動作方法并重新映射其方法名稱添加${id}/前綴,示例代碼在這里:
const m1 = {
id: 'm1',
actions: {
down(id: string) {
return true;
},
up(n: number) {
return 0;
}
}
}
const m2 = {
id: 'm2',
actions: {
play(id: string) {
return true;
},
go(n: number) {
return 0;
}
}
}
type MyModule = ??
// should return :
// MyModule = {
// 'm1/down': (id: string) => boolean,
// 'm1/up': (n: number) => number;
// 'm2/play': (id: string) => boolean;
// 'm2/go': (n: number) => number;
// }
操場
這在打字稿中可能嗎?
uj5u.com熱心網友回復:
您可以在較新版本的 Typescript 中使用映射型別和模板文字型別來執行此操作:
type ModuleDefnition = {
id: string,
actions: Record<string, (...a: any[]) => any>
}
type Module<T extends ModuleDefnition> = {} & {
[P in keyof T['actions'] & string as `${T['id']}/${P}`]: T['actions'][P]
}
type MyModule = Module<typeof m1> & Module<typeof m2>
游樂場鏈接
模塊定義的唯一變化是id你需要確保你有一個字串文字型別
如果您有未知數量的模塊或者您想使用函式創建模塊,您也可以使用UnionToIntersection(from here )。
type DistributeModule<T extends ModuleDefnition> = T extends T ? Module<T> : never;
type UnionToIntersection<U> =
(U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never
function merge<T extends ModuleDefnition[]>(...a: T):UnionToIntersection<DistributeModule<T[number]>> {
return null!;
}
let myModule = merge(m1, m2)
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/429990.html
