gpt4 book ai didi

typescript - 如何声明在类型别名中声明的仅一个别名的数组

转载 作者:行者123 更新时间:2023-12-04 13:24:53 26 4
gpt4 key购买 nike

如果我有一个像这样定义的 TypeScript 类型别名:

export type PlatformType = 'em' | 'ea' | 'hi';
我如何在接口(interface)中声明一个属性,以便该属性是每个 PlatformType 的一种类型的数组别名?例如,我想要这个:
export interface Constants {
platformTypes: PlatformType[]; // how to declare a type for platformTypes?
}
所以当我有一个 Constants 的对象时类型,我需要这个:
export const constants: Constants = {
platformTypes: ['em', 'ea', 'hi']
}
基本上,如果我有这个,我想得到一个错误:
export const constants: Constants = {
platformTypes: ['em', 'ea'] // should error, missing 'hi'
}
或者
export const constants: Constants = {
// this will error anyway because 'extra' doesn't belong to PlatformType alias
platformTypes: ['em', 'ea', 'hi', 'extra']
}
或者
export const constants: Constants = {
platformTypes: ['em', 'em', 'ea', 'hi'] // should error, duplicate 'em'
}

最佳答案

我认为您应该定义所有允许的元组的排列。
例如,如果您有三个元素的联合,您需要创建至少 6 个元组:

["em", "ea", "hi"] | ["em", "hi", "ea"] | ["ea", "em", "hi"] | ["ea", "hi", "em"] | ["hi", "em", "ea"] | ["hi", "ea", "em"]
这是因为联合是无序的数据结构。
export type PlatformType = 'em' | 'ea' | 'hi';


// credits goes to https://twitter.com/WrocTypeScript/status/1306296710407352321
type TupleUnion<U extends string, R extends any[] = []> = {
[S in U]: Exclude<U, S> extends never ? [...R, S] : TupleUnion<Exclude<U, S>, [...R, S]>;
}[U];

export interface Constants {
platformTypes: TupleUnion<PlatformType>; // how to declare a type for platformTypes?
}

export const constants: Constants = {
platformTypes: ['em', 'ea', 'hi'] // ok
}

export const constants2: Constants = {
platformTypes: ['em', 'ea'] // error
}

export const constants3: Constants = {
platformTypes: ['em', 'ea', 'hi', 'extra'] // error
}

export const constants4: Constants = {
platformTypes: ['em', 'em', 'ea', 'hi'] // error
}
Playground
请记住, typescript 中联合的顺序很棘手。
请查看 this questionthis问题
您可以在我的 blog 中找到更多示例

关于typescript - 如何声明在类型别名中声明的仅一个别名的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69100938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com