如何从Typescript中的常量定义字符串文字联合类型

时间:2019-05-22 18:50:21

标签: typescript string-literals typescript3.0 union-types

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

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

2 个答案:

答案 0 :(得分:6)

在这种情况下,您也可以使用枚举。例如:

// Define enum.
enum myConstants {
  MY_CONSTANT = 'my_constant',
  SMTH_ELSE = 'smth_else'
}

// Use it in an interface for typechecking.
interface MyInterface {
  myProp: myConstants
}

// Example of correct object - no errors.
let a: MyInterface = {
  myProp: myConstants.MY_CONSTANT
}

// Incorrect value - TS reports an error.
let b: MyInterface = {
  myProp: 'John Doe'
}

More about enums

答案 1 :(得分:3)

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

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