是否可以通过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,并使用属性keyval

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',没有类型扩展。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...