如何解决是否可以通过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"
解决方法
首先,为了使对象稍微减少混乱,我们将其命名为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'
,没有类型扩展。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。