為了在開發程序中更好地傳達物件的不變性,我想將整個物件轉換為只讀。基本上,該類有一個copy()
函式,該函式應回傳其自身的只讀副本。重要的部分只是,該型別是只讀的,因此在開發程序中會引發編譯器錯誤。實際的運行時行為并不那么重要。
使用Readonly<>
實用程式型別,只有原始型別被強制轉換為只讀。但是這個類也有一個Map
,它甚至是通用的。如何在不丟失通用值的情況下將其轉換Map
為 a ?ReadonlyMap
這是一個小代碼片段來說明問題:
class MyClass<T> {
public name: string = "Name";
public data: Map<string, T> = new Map<string, T>();
// "this" is used for correct typing of inheriting classes here
public copy(): ReadonlyClass<this> {
return structuredClone(this) as ReadonlyClass<this>;
}
}
export type ReadonlyClass<T extends MyClass<any>> = {
[P in keyof T]: T[P] extends Map<string, any>
? ReadonlyMap<string, /* what can I put here? */>
: Readonly<T[P]>;
};
我嘗試通過values()
map: 的函式獲取型別ReturnType<T[P]['values']>
,但是回傳一個IterableIterator
,據我所知,沒有辦法從那里提取值型別。
這對于 TypeScripts 當前的功能集是不可能的嗎?
謝謝!
uj5u.com熱心網友回復:
關鍵字在這里infer
派上用場。我們可以使用它來推斷的鍵型別K
和值型別V
,Map
并使用它們來構造ReadonlyMap<K, V>
。
export type ReadonlyClass<T extends MyClass<any>> = {
[P in keyof T]: T[P] extends Map<infer K, infer V>
? ReadonlyMap<K, V>
: Readonly<T[P]>;
}
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/529960.html
標籤:打字稿打字稿泛型