Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Typescript中的常量定义字符串文字联合类型_Typescript_String Literals_Typescript3.0_Union Types - Fatal编程技术网

如何从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'
指定常量类型使其接受任何字符串。对不起,我会投你一票的!