是否可以从数组创建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[]