是否可以从数组创建typescript类型?

是否可以从数组创建typescript类型?,typescript,typescript-typings,Typescript,Typescript Typings,我经常使用诸如 export type Stuff = 'something' | 'else' export const AVAILABLE_STUFF: Stuff[] = ['something', 'else'] 这样,我既可以使用类型Stuff,也可以根据需要迭代所有可用的Stuff 这是可行的,但感觉像是重复了两次信息。你必须小心,因为更新Stuff或AVAILABLE\u Stuff也需要更新相应的内容 是否有更好的方法从数组中定义类型,或者甚至在某种程度上使用数组来键入某些数据

我经常使用诸如

export type Stuff = 'something' | 'else'
export const AVAILABLE_STUFF: Stuff[] = ['something', 'else']
这样,我既可以使用类型
Stuff
,也可以根据需要迭代所有可用的Stuff

这是可行的,但感觉像是重复了两次信息。你必须小心,因为更新
Stuff
AVAILABLE\u Stuff
也需要更新相应的内容


是否有更好的方法从数组中定义类型,或者甚至在某种程度上使用数组来键入某些数据?

一个内置选项是使用枚举,而不是使用类型和数组方法

export enum Stuff {
    something = 'something',
    else = 'else',
}

export const AVAILABLE_STUFF: Stuff[] = Object.values(Stuff);
另一个选项是从可用的类型中提取类型。要做到这一点,我们必须强制编译器为
AVAILABLE\u STUFF
推断字符串文本的元组。这可以在
3.4
中使用
as const
或在
3.4
之前使用额外的函数来完成。在
AVAILABLE\u STUFF
是元组类型之后,我们可以使用类型查询来获取元素的类型:

export const AVAILABLE_STUFF = (<T extends string[]>(...o: T)=> o)('something', 'else'); // typed as ["something", "else"]
// export const AVAILABLE_STUFF = ['something', 'else'] as const; // typed as ["something", "else"]  in 3.4
export type Stuff = typeof AVAILABLE_STUFF[number] //"something" | "else"
export const AVAILABLE_STUFF=((…o:T)=>o)('something','else');//键入为[“某物”、“其他”]
//导出常量可用\u STUFF=['something','else']作为常量;//在3.4中输入为[“某物”,“其他”]
导出类型Stuff=可用的类型_Stuff[编号]/“某物”|“其他”
对上述代码的一些解释
typeof AVAILABLE\u STUFF
为我们提供常数的类型(
[“something”,“else”]
),以获取
[数字]
称为a,并将为我们提供元组中项目的类型


((…o:T)=>o)
只是我们用来强制编译器推断字符串文本元组类型的一个生命。它必须是泛型的,因为编译器在某些情况下只能推断文字类型和元组(其中一个类型参数具有
string
约束)。
as const
版本是我建议在可用时使用的版本,因为它更具可读性。

另一种可能性是创建一个对象并使用
keyof
。我建议只有当您有任何有用的东西可以存储为值时才使用这种方法(替换下面代码中的
null

从Typescript v3.14开始相当简单 你可以这样做-

export const AVAILABLE_STUFF=['something','else'];
导出类型物料=可用物料的类型【数量】;
更多信息-

您想用类型填充数组吗?或者像这样使用数组的用例是什么?@MuratKaragöz。我希望能够从
const x:Stuff
AVAILABLE\u Stuff.forEach(Stuff=>…)
中获益,只需一个声明。我不在乎是否必须声明数组、类型或其他我还不知道的东西:)您考虑过使用字符串吗?看起来它应该做你想做的。它是一个类型,您可以迭代值。在第二个解决方案中,我看到类型
Stuff
被正确推断,但我不理解语法。
[number]
在可用材料[number]的
类型中扮演什么角色?@Paleo添加了一些解释,现在让我知道它是否更清晰。我明白了!谢谢。@a服务这不是一个完美的替代品。您需要在TS代码中使用
let a:Stuff=Stuff.something
。在运行时,
a
的值将是
某个东西
@MoshFeu这应该是可行的:这也是一个很好的解决方案为什么它必须是
可用的东西[number]
而不仅仅是
可用的东西[]
const stuffDict = {
  something: null,
  else: null,
}

type Stuff = keyof typeof stuffDict
const AVAILABLE_STUFF = Object.keys(stuffDict) as Stuff[]