export const CHRONIC_CHANNEL_LEVELS = [
{ label: 'one', value: '1' },
{ label: 'two', value: '2' },
] as const;
export type ElementType<T extends any[]> = T extends (infer U)[] ? U : never;
type ChronicChannelLevel = ElementType<typeof CHRONIC_CHANNEL_LEVELS>['value']; // throw error
TSC 抛出错误:
Type 'readonly [{ readonly label: "one"; readonly value: "1"; }, { readonly label: "two"; readonly value: "2"; }]' does not satisfy the constraint 'any[]'.
The type 'readonly [{ readonly label: "one"; readonly value: "1"; }, { readonly label: "two"; readonly value: "2"; }]' is 'readonly' and cannot be assigned to the mutable type 'any[]'.(2344)
const
断言似乎无法将类型分配给泛型参数的类型any[]
。
我希望类型ChronicChannelLevel
是联合类型'1' | '2'
。
我知道我可以使用typeof CHRONIC_CHANNEL_LEVELS[number]['value']
,但我想创建一个实用程序类型,例如ElementType
从数组中获取元素类型。
通过接受元组/数组和只读元组/数组是根本不同的类型,我们可以取得进展:
export type ElementType<T extends (any[] | readonly any[])> =
T extends (infer U)[] ?
U :
T extends readonly (infer U)[] ?
U :
never
...或通过引入一种新类型:
export type ArrayType<T> = T[] | readonly T[]
export type ElementType<T extends ArrayType<any>> =
T extends ArrayType<infer U> ?
U :
never
我们可以简化条件类型所需的推理和分支量
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句