簡體   English   中英

用於在 TypeScript 中使對象部分只讀的類型構造函數

[英]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] }

表現得像選擇/排除和部分組合的東西?

您實際上可以結合ReadonlyPickOmit來獲得所需的效果:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM