簡體   English   中英

是否可以通過 Typescript 中的映射類型將文字對象中的值(不是鍵)作為文字而不是其類型(例如字符串)獲取?

[英]Is it possible to get the value (not key) in a literal object as a literal, not its type (such as string) via mapped type in Typescript?

下面,我有一個文字對象 {a:"a"}。 我想將對象的值提取為文字“a”,而不是它的類型字符串,以便檢查其他一些變量是否是“a”而不是任何其他字符串。

但是,如果我使用映射類型,我只會得到字符串,而不是“a”。

有沒有辦法將值作為類型獲取?

const a = {a:"a"}
type trueIfLiteral<T extends string>= string extends T?false:true;

type key = keyof typeof a;
const t1 : trueIfLiteral<key> = true; // key is literal

type val = typeof a[key];
const t2 : trueIfLiteral<val> = false; // val is string

所以問題很簡單,我怎樣才能派生出一個類型:

type valAsLiteral = "a"

首先,為了使對象稍微不那么令人困惑,讓我們將其稱為具有屬性keyval obj

const obj = { key: "val" };

這里的一個問題是對象的類型為{ key: string } TypeScript 已自動將'val''val'擴展為字符串。 如果你想防止這種擴大,你可以將對象聲明as const

const obj = { key: "val" } as const;

這會導致您的代碼正常工作,並且

type val = typeof obj[key];

產生'val' (和const t2 : trueIfLiteral<val> = false; // val is string失敗,因為val不再是通用字符串,而只是val

要在發出的 JS 中獲取值,而不是在 TS 中,您可以執行

const val = Object.values(obj)[0];

生成'val' ,類型為'val' ,沒有類型擴展。

暫無
暫無

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

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