如何从Typescript中的常量定义字符串文字联合类型
我知道我可以定义字符串联合类型,将变量限制为可能的字符串值之一:如何从Typescript中的常量定义字符串文字联合类型,typescript,string-literals,typescript3.0,union-types,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 但由于某种原因,它不起作用;它说M
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_常量引用了一个值,但在这里它被用作一个类型
为什么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
注意:
因为当人们使用这个时,似乎有很多困惑。const
很重要。如果使用其他类型的声明(let
或var
),则最后一种类型将是string。只有const
保留字符串文字类型
注2:
要使此解决方案起作用,您必须不在
常量上指定任何类型注释,并让编译器推断常量的类型(例如,这将不起作用:常量MY_常量:字符串='MY_常量'
)您也可以在这种情况下使用enum。例如:
// 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'
}
听起来你真正想要的是一个…?你想要的是类型MyType=typeof MY_常量| typeof SOMETHING
。类型(仅在设计时存在)和值(在运行时存在)之间有很大的区别。当我感觉到类型和值之间的混淆时,我经常向人们抛出。@T.J.Crowder考虑过这一点,但我有在其他地方定义的常量字符串,我想知道use@CanPoyrazo奥卢——很公平,那么提香的答案就是你想要的。@CanPoyrazoğlu“test”是一个值和一个类型(一个字符串文字类型),根据定义(就像类是一个值、构造函数和一个类型、实例类型)typeof MY_CONSTANT
将检查它是否是一个任意的字符串
,不特别是MY_常量
如果有人能解释对这个答案的反对票,我将不胜感激。我支持答案,它仍然做它应该做的,并且是对原始问题的回答。如果有人对此有意见,请告诉我know@JonasRosenqvist请阅读评论和注释。请检查相关的操场链接。如果您使用const,那么文本类型将被保留,并且类型检查将按预期工作,并且并非所有字符串都兼容。如果你有一个样本,这是不是真的,我想看看它。对不起,如果我听起来有点疯狂,但这个答案一直在无缘无故地获得反对票,这是非常恼人的。我不知道我能做些什么来让康斯特更清楚required@TitianCernicova-Dragomir-你说得对,我犯了一个错误,将常量声明为:const MY_constant:string='MY_constant'
指定常量类型使其接受任何字符串。对不起,我会投你一票的!