[英]Type constructor for making objects partially readonly in TypeScript
是否有用於使 object 上的某些屬性只讀的類型構造函數? 例如:
type ReadonlyByKey<T extends {} , K extends keyof T> = {
[P in T]: P extends K > Readonly<T[P]> : T[P]
}
(這不起作用,因為我們在這里將 Readonly 應用於T[P]
而不是{ P: T[P] }
)
表現得像選擇/排除和部分組合的東西?
您實際上可以結合Readonly
、 Pick
和Omit
來獲得所需的效果:
type ReadonlyByKey<T extends {} , K extends keyof T> = Readonly<Pick<T, K>> & Omit<T, K>
第一個交叉點成分選擇只讀成員,而第二個交叉點成分選擇其他成員
編輯
按類型刪除的版本是:
type KeyOfType<T, V> = {
[P in keyof T]: T[P] extends V ? P: never
}[keyof T]
type ReadonlyByKey<T extends {} , K extends keyof T> = Readonly<Pick<T, K>> & Omit<T, K>
type ReadonlyByType<T, V> = ReadonlyByKey<T, KeyOfType<T, V>>
這是我根據給定類型而不是一組鍵提出的解決方案:
我相信這可以簡化。
type KeysOfType<T, O> = {
[P in keyof O]: O[P] extends T ? P : never;
};
type Values<T> = T extends { [k: string]: infer V } ? V : never;
type State = {
message: string;
counter: number;
};
type ReadonlyIfType<T, O> = Readonly<
Omit<O, Exclude<keyof O, Values<KeysOfType<T, O>>>>
> &
Omit<O, keyof Omit<O, Exclude<keyof O, Values<KeysOfType<T, O>>>>>;
type WhatDidIDo = ReadonlyIfType<number, State>;
declare const wtf: WhatDidIDo
wtf.message = 'Hello' // Does not error and should not
wtf.counter = 4 // Fails and shoud
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.