从TypeScript中的数组生成字符串文字类型

从TypeScript中的数组生成字符串文字类型,typescript,Typescript,我的定义文件中有此对象 导出常量属性={ 名称:“”, 级别:['a','b','c'], uri:“”, 主动:正确 } (注意:它不是一个接口,它实际上是一个真实的对象,我需要一个对象的原因是因为我在运行时需要它作为引用) 现在我尝试从这个对象创建一个类型,这就是我需要的 导出类型属性={ 名称:字符串; 级别:“a”|“b”|“c”; uri:字符串; 活动:布尔值 } 我试着用 export type Properties = typeof properties 但是level被翻

我的定义文件中有此对象

导出常量属性={
名称:“”,
级别:['a','b','c'],
uri:“”,
主动:正确
}
(注意:它不是一个接口,它实际上是一个真实的对象,我需要一个对象的原因是因为我在运行时需要它作为引用)

现在我尝试从这个对象创建一个类型,这就是我需要的

导出类型属性={
名称:字符串;
级别:“a”|“b”|“c”;
uri:字符串;
活动:布尔值
}
我试着用

export type Properties = typeof properties
但是
level
被翻译成
string[]
,这是正常的,但是如何使用TypeScript将
['a','b','c']
映射到
'a'.'b'.'c'
?如果可能的话,在将一种类型映射到另一种类型的过程中,我如何做到这一点


谢谢

如果您像上面那样定义
属性
,那么它将不起作用。当您开始编写
类型属性=
时,编译器已经将
级别的
属性扩展到
字符串[]
,并且忘记了它的所有元素,如您所见

因此,为了有机会从
属性中获取
“a”|“b”|“c”
,您需要更改
属性的定义。最简单的方法是使用a向编译器提供一个提示,提示您想要它能推断出的最窄类型。例如:

const properties = {
    name: '',
    level: ['a', 'b', 'c'] as const,
    uri: '',
    active: true
}
我们将
级别
断言为
常量
,现在
属性类型
如下所示:

/* const properties: {
    name: string;
    level: readonly ["a", "b", "c"];
    uri: string;
    active: boolean;
} */
那么,我们如何将其转换为
属性
?假设问题“在将一种类型映射到另一种类型的过程中,我如何做到这一点?”意味着您希望将每个类似数组的东西都转换为其元素类型,并且假设您只需要进行一级深度的转换(而不是递归),那么您可以定义此类型函数:

type Transform<T> = { [K in keyof T]: 
  T[K] extends readonly any[] ? T[K][number] : T[K] 
}
如所愿


术语问题:你说的是,不是。@jcalz谢谢。标题已更新。您似乎希望
属性
具有类型
属性
。但是在
properties
中,
level
的类型是一个字符串列表,而在
properties
中,它只是一个字符串。这是一个多么漂亮的答案啊,你不仅分享了非常先进的知识,而且花时间解释了事情是如何以一种非常好的方式进行的。现在不仅有效,我也知道原因。非常感谢@jcalz谢谢
type Properties = Transform<typeof properties>
/* type Properties = {
    name: string;
    level: "a" | "b" | "c";
    uri: string;
    active: boolean;
} */