我有一個物件映射如下:
const obj: {
AddRowOperation: typeof RowOperations.AddRowOperation;
DeleteRowOperation: typeof RowOperations.DeleteRowOperation;
FilterRowsOperation: typeof RowOperations.FilterRowsOperation;
... 25 more ...;
ResetRowStatusOperation: typeof RowOperations.ResetRowStatusOperation;
}
我想將此物件映射到每個類的實體。所以型別應該是:
const obj: {
AddRowOperation: RowOperations.AddRowOperation;
DeleteRowOperation: RowOperations.DeleteRowOperation;
FilterRowsOperation: RowOperations.FilterRowsOperation;
... 25 more ...;
ResetRowStatusOperation: RowOperations.ResetRowStatusOperation;
}
我嘗試了很多選擇,但型別總是最終被聯合,如:
const obj: {
AddRowOperation: (RowOperations.AddRowOperation | RowOperations.DeleteRowOperation | ...);
// etc...
}
我會認為這是一個簡單的場景。動態實體化類而不是手動鍵入每個類會很棒。
這可以在保持打字稿快樂的同時完成嗎?這些類不共享公共介面。
編輯
jaclz 提出的解決方案:
type InstanceTypeProps<T extends Record<keyof T, new (...args: any) => any>> = { [K in keyof T]: InstanceType<T[K]> };
class A {}
class B {}
class C {}
const obj = { A, B, C }
type mapOfInstances = InstanceTypeProps<typeof obj>
演示
uj5u.com熱心網友回復:
看起來您想要一個映射型別,typeof obj用于通過 轉換每個屬性的位置InstanceType<T>,這是一種實用程式型別,它使用條件型別推斷將構造簽名型別轉換為它構造的實體的簽名型別。我們稱之為映射型別InstanceTypeProps<T>。你可以這樣寫:
type InstanceTypeProps<T extends Record<keyof T, new (...args: any) => any>> =
{ [K in keyof T]: InstanceType<T[K]> };
我們只是應用InstanceType到每個屬性T[K]。唯一的額外細節是我們必須約束 T到一個型別,其中每個屬性都是一個構造簽名。這看起來像Record<keyof T, new (...args: any) => any>,意思是一個物件,它的鍵是我們想要的任何鍵(實際上對鍵沒有限制可以這樣說T extends Record<keyof T, ...>)并且其值可以分配給new (...args:any) => any,一個構造簽名。
讓我們確保它有效:
type MapOfInstances = InstanceTypeProps<typeof obj>;
/* type MapOfInstances = {
AddRowOperation: RowOperations.AddRowOperation;
DeleteRowOperation: RowOperations.DeleteRowOperation;
FilterRowsOperation: RowOperations.FilterRowsOperation;
//... 25 more ...;
ResetRowStatusOperation: RowOperations.ResetRowStatusOperation;
} */
看起來挺好的!
Playground 鏈接到代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/387142.html
標籤:打字稿
下一篇:不允許使用zod決議的額外屬性
