簡體   English   中英

TypeScript 類型,僅強制執行 object 的屬性

[英]TypeScript type that enforces only the properties of an object

假設我有以下內容:

const myObj = { foo: 'cat', bar: 'dog', baz: 'bird' } as const;

type MyValue = 'fish' | 'bear' | 'cow';

const myValueMap: Record<string, MyValue> = {
  [myObj.foo]: 'fish',
  [myObj.bar]: 'cow',
} as const;

因為myValueMap被聲明為帶有任意字符串鍵的 object,所以我們不會對dog cat的實際鍵進行類型檢查。 我可以完全刪除顯式聲明,但是我不強制這些值是MyValue (在我的實際代碼中, MyValue是數百個常量字符串。)

有沒有辦法,最好不使用包裝器 function,強制值是MyValue並且仍然保持屬性類型檢查?

TS游樂場

也許使用更多的 generics -

const myValueMap: Record<myObj[keyof myObj], MyValue> = {
  [myObj.foo]: 'fish',
  [myObj.bar]: 'cow',
};

如果我對您的理解正確,這就是您可以實現所需的方法:

const myObj = { foo: 'cat', bar: 'dog', baz: 'bird' } as const;

type MyValue = 'fish' | 'bear' | 'cow';

const myObjValue = myObj["" as keyof typeof myObj];

const myMap: Partial<Record<typeof myObjValue, MyValue>> = {
  [myObj.foo]: 'fish',
  [myObj.bar]: 'cow',
} as const;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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