问题描述
下面,我有一个文字对象{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"
解决方法
首先,为了使对象稍微减少混乱,我们将其命名为obj
,并使用属性key
和val
:
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'
,没有类型扩展。