Javascript 使用字符串和对象文字属性定义类型

Javascript 使用字符串和对象文字属性定义类型,javascript,typescript,Javascript,Typescript,我已经翻阅了TS文档,但似乎找不到以下内容非法的答案 我可以用字符串定义一个联合类型,但是如果我用对象属性的引用创建同一个联合类型,最终引用相同的字符串值,编译器会不高兴 interface Column { label: string; defaultSortOrder: SortOrderWithStrings; } const MyColumn: Column = { label: 'My Column', defaultSortOrder: SortOrderStati

我已经翻阅了TS文档,但似乎找不到以下内容非法的答案

我可以用字符串定义一个联合类型,但是如果我用对象属性的引用创建同一个联合类型,最终引用相同的字符串值,编译器会不高兴

interface Column {
  label: string;
  defaultSortOrder: SortOrderWithStrings;
}

const MyColumn: Column = {
  label: 'My Column',
  defaultSortOrder: SortOrderStatic.ASC
}

//成功
导出类型SortOrderWithString='asc'|'desc';
导出常量SortOrderStatic={
ASC:“ASC”,
描述:“描述”,
}
//失败
导出类型SortOrderWithObject=SortOrderStatic.ASC | SortOrderStatic.DESC;
错误如下。为什么这是一个名称空间问题

Cannot find namespace 'SortOrderStatic'
Exported type alias 'SortOrderReference' has or is using private name 'SortOrderType'
最后,最好有一个
Column
接口定义支持的排序顺序类型,然后用
SortOrderStatic
实例化
Column
,以避免出现神奇的字符串,但根据上述情况,这似乎是不可能的

接口列{
标签:字符串;
defaultSortOrder:SortOrderWithObject;
}
常量MyColumn:列={
标签:“我的专栏”,
defaultSortOrder:SortOrderStatic.ASC
}
如果我按如下方式定义接口(使用
SortOrderWithStrings
),然后尝试使用
SortOrderStatic
,编译器再次感到不高兴

interface Column {
  label: string;
  defaultSortOrder: SortOrderWithStrings;
}

const MyColumn: Column = {
  label: 'My Column',
  defaultSortOrder: SortOrderStatic.ASC
}

在以下情况下失败:

Type 'string' is not assignable to type 'SortOrderWithStrings'.

很明显,我在这里遗漏了一些基本的东西,我很欣赏任何见解


很明显我遗漏了一些基本的东西

是的,您混淆了编译时和运行时:除非编译时类型是文本字符串,否则编译器无法保证对象属性的运行时访问是您认为的字符串。您的对象属性是type
string
,这意味着在运行时它可以是任何字符串

字符串文本是不可变的(因此可以静态验证),对象属性访问不太多

在您的特殊情况下,我只会使用:


这将维护类型安全性,您不能将任何ol'字符串传递给需要排序器的对象。:()

“很明显,我在这里缺少一些基本的内容”是的,您混淆了编译时和运行时。除非编译时类型是文本字符串,否则编译器无法保证对象属性的运行时访问是您认为的字符串。您的对象属性是type
string
,这意味着在运行时它可以是任何字符串。字符串文字是不可变的(因此可以静态验证),对象属性访问不太多。@JaredSmith谢谢,好的,这很有意义。我想知道如果
SortOrderStatic
的类型是
interface{[x:string]:string;}
,编译器是否可以推断出预期的运行时类型。这还不够明确吗?在这种情况下,我会使用@JaredSmith谢谢,我想你的最新评论为我做到了这一点。编译器不可能知道我最终的
ASC
是什么。几乎每个人(包括我刚开始的时候!)在TS上遇到的问题都来自于这种融合。