我有一个字符串联合类型,如下所示:
type Suit = 'hearts' | 'diamonds' | 'spades' | 'clubs';
我想要一种类型安全的方法来获取可以在此字符串联合中使用的所有可能的值。但是由于接口在很大程度上是设计时构造,所以我能做的就是:
export const ALL_SUITS = getAllStringUnionValues<Suit>({
hearts: 0,
diamonds: 0,
spades: 0,
clubs: 0
});
export function getAllStringUnionValues<TStringUnion extends string>(valuesAsKeys: { [K in TStringUnion]: 0 }): TStringUnion[] {
const result = Object.getOwnPropertyNames(valuesAsKeys);
return result as any;
}
这项工作正常,该函数可确保我始终传递一个对象,其中每个键都是字符串联合中的一个元素,并且包括每个元素,并返回所有元素的字符串数组。因此,如果字符串并集发生更改,则对该函数的调用将在编译时发生错误(如果未更新)。
但是问题是常量ALL_SUITSis 的类型签名('hearts' | 'diamonds' | 'spades' | 'clubs')[]。换句话说,TypeScript认为这是一个不包含一个或多个这些值(可能带有重复项)的数组,而不是一个仅包含一次所有值的数组,例如['hearts', 'diamonds', 'spades', 'clubs']。
我真正想要的是通用getAllStringUnionValues函数指定它返回的一种方法['hearts', 'diamonds', 'spades', 'clubs']。
我怎样才能做到这一点一般,同时为干越好?
蛊毒传说