我知道我可以定义字符串联合类型,将变量限制为可能的字符串值之一:

type MyType = 'first' | 'second'
let myVar:MyType = 'first'

我需要从常量字符串构造这样的类型,例如:

const MY_CONSTANT = 'MY_CONSTANT'
const SOMETHING_ELSE = 'SOMETHING_ELSE'
type MyType = MY_CONSTANT | SOMETHING_ELSE

但由于某种原因,它不起作用;上面写着MY_CONSTANT refers to a value, but it being used as a type here.

为什么Typescript允许第一种情况,但不允许第二种情况?我用的是Typescript 3.4.5

推荐答案

要获取变量的类型,需要使用typeof type运算符:

const MY_CONSTANT = 'MY_CONSTANT' // must be const, no annotation. let or var will not work
const SOMETHING_ELSE = 'SOMETHING_ELSE' // must be const, no annotation. let or var will not work
type MyType = typeof MY_CONSTANT | typeof SOMETHING_ELSE

Playground

Note:

因为当人们使用这个时,似乎有很多困惑.const人很重要.如果使用其他类型的声明(letvar),那么最后的类型将是string.只有const 保留字符串文字类型.

Note 2:

为了使这个解决方案有效,您必须在const上指定任何类型注释,并让编译器推断常量的类型(例如,这将是not work:const MY_CONSTANT: string = 'MY_CONSTANT')

Typescript相关问答推荐

无需刷新即可让现场访客逆变

在Angular中,如何在文件上传后清除文件上传文本框

Redux—Toolkit查询仅在不为空的情况下添加参数

react 路由6操作未订阅从react 挂钩表单提交+也不使用RTK查询Mutations

具有泛型类型和缺省值的键

返回具有递归属性的泛型类型的泛型函数

是否有一个版本的联合类型递归地使属性只出现在一个可选选项中?

在VSCode中显示eslint错误,但在终端中运行eslint命令时不显示?(Vite,React,TypeScript)

回调函数中的TypeScrip类型保护返回Incorect类型保护(具有其他未定义类型的返回保护类型)

如何键入并类型的函数&S各属性

如何在具有嵌套数组的接口中允许新属性

TaskListProps[]类型不可分配给TaskListProps类型

基于闭包类型缩小泛型类型脚本函数的范围

有没有更干净的方法来更新**key of T**的值?

仅当定义了值时才按值筛选数组

Svelte+EsBuild+Deno-未捕获类型错误:无法读取未定义的属性(读取';$$';)

从泛型对象数组构造映射类型

如何从联合类型推断函数参数?

元素隐式具有any类型,因为string类型的表达式不能用于索引类型{Categories: Element;管理员:元素; }'

如何在 ngFor 循环中以Angular 正确动态渲染组件