将数组的元素关联为属性Typescript的类型

将数组的元素关联为属性Typescript的类型,typescript,types,Typescript,Types,有没有办法将属性的类型指定为数组的元素?我有以下课程: class SomeClass { color: 'red' | 'blue'; } 是否有方法使用允许的颜色创建数组并将其指定给colortype class SomeClass { color: *some way to get "'red' | 'blue'" from allowedColors*; allowedColors = ['red', 'blue']; } 默认情况下,allowedColors=['re

有没有办法将属性的类型指定为数组的元素?我有以下课程:

class SomeClass {
  color: 'red' | 'blue';
}
是否有方法使用允许的颜色创建数组并将其指定给
color
type

class SomeClass {
  color: *some way to get "'red' | 'blue'" from allowedColors*;
  allowedColors = ['red', 'blue'];
}

默认情况下,
allowedColors=['red'、'blue']
将推断
allowedColors
的类型为
string[]
,使用类似的技巧,我们可以说服编译器将其键入
('red'|'blue')[/code>,一旦我们有了它,我们就可以将
color
键入与该数组的元素具有相同类型:

function arrayTypeHelper<T extends string>(o: Array<T>): T[] {
  return o;
}

class SomeClass {
  static allowedColors = arrayTypeHelper(['red', 'blue']);
  color: typeof SomeClass.allowedColors[0]; // 'red' | 'blue'
}
注意我更改了
允许颜色
静态
只读
,因为基于这个问题,字段可能不应该是可变的,并且对于类的所有实例都是相同的。这也是进行相关键入所必需的


注2虽然此解决方案在您当前设计的约束范围内工作,但也许您应该考虑作为替代方案。

默认情况下
allowedColors=['red','blue']
将推断
allowedColors
的类型为
string[]
,使用类似于的技巧,我们可以说服编译器将其键入为
('red'|'blue')[
一旦我们有了它,我们就可以键入
color
作为与该数组的元素具有相同的类型:

function arrayTypeHelper<T extends string>(o: Array<T>): T[] {
  return o;
}

class SomeClass {
  static allowedColors = arrayTypeHelper(['red', 'blue']);
  color: typeof SomeClass.allowedColors[0]; // 'red' | 'blue'
}
注意我更改了
允许颜色
静态
只读
,因为基于这个问题,字段可能不应该是可变的,并且对于类的所有实例都是相同的。这也是进行相关键入所必需的


注2虽然此解决方案在您当前设计的约束范围内工作,但也许您应该考虑作为替代方案。

我认为,将颜色声明为枚举是最常见的方法,AllowedColor应该从枚举中读取允许的值:

enum Color {
    red,
    blue,
}

private allowedColors: Color[] = Object.keys(Color).map(key => Color[key]);
private color: Color = allowedColors[0];

我认为这是将颜色声明为枚举的最常见方式,AllowedColor应该从枚举中读取允许的值:

enum Color {
    red,
    blue,
}

private allowedColors: Color[] = Object.keys(Color).map(key => Color[key]);
private color: Color = allowedColors[0];