網站搜尋

typescript - 是否可以在字面量上使用 `keyof` 運算子,而不是在介面上?


我有一個物件字面量,例如以下內容(所有屬性在編譯時都是已知的):

const foo = {
  "hello": "hola"
};

如果 foo 是介面而不是變數,我就可以輕鬆地做類似的事情

/** THEORETICAL ONLY - Does not compile! */
function translate(input: keyof foo): string {
  return foo[input];
}

然而,對變數這樣做是行不通的,因為編譯器找不到名稱為 foo 的介面。

TypeScript 是否支援對其值在編譯時已知的物件字面量進行 keyof 操作?

答案#1

keyof 作用於類型,但 foo 是一個值。但是 typeof 運算子接受一個值並產生它的類型,因此你可以使用 keyof typeof foo 來做到這一點。

請注意,這僅在你尚未將介面與物件字面量關聯時有效(感謝 radicand)。

答案#2

有點偏離主題,雖然我正在尋找索引器鍵對應的字面值,但先把它放在這裡以備將來參考。

const foo = {
  "hello": "hola"
};

let data: { [key in keyof typeof foo]:number} & { name: string, index: number }[] = [] as any;

data.foo = 1;
data[0] = {name:'foo', 1};