![](/img/trans.png)
[英]TypeScript mapped type to represent an object with optional Observables (with string literal mapped keys)
[英]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"
首先,為了使對象稍微不那么令人困惑,讓我們將其稱為具有屬性key
和val
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.