我想写这样的东西:
measurement
其中const structs: Record<T extends StructureConstant,Array<ConcreteStructure<T>>> = Object.create(null);
是常量的并集,而StructureConstant
基本上是type lookup。
在TypeScript中可以这样做吗?我不知道如何使值取决于键。
这是一个完整的例子:
ConcreteStructure
答案 0 :(得分:2)
在打字稿中,仅函数值可以具有泛型。其他值需要完全指定。
所以也许您想要这样的东西:
type StuctureRecord<T extends StructureConstant> = Record<T, Array<ConcreteStructure<T>>>
// structs doesn't have a generic type.
const structs: StuctureRecord<StructureConstant> = Object.create(null);
或
// function can have generic type.
const structsCreator = <T extends StructureConstant>(): Record<T, Array<ConcreteStructure<T>>> => Object.create(null)
const structs = structsCreator<StructureConstant>()
要获得上述效果,您不能使用唱片。记录将所有键映射到相同的类型。如果每个条目都需要不同的类型,则需要自定义映射类型
type StuctureMappedType<T extends StructureConstant> =
{ [K in T]: Array<ConcreteStructure<K>>}
答案 1 :(得分:2)
我最近遇到了一个非常相似的案例,诀窍是避免使用 Record
实用程序:
type FilterValues<T> = T extends 'date'
? Date | null
: T extends 'date-range'
? [Date, Date] | [null, null]
: T extends 'select'
? string
: T extends 'text'
? string
: never
type FilterType = 'date-range' | 'select' | 'text'
type FilterRenderers = {
[K in FilterType]: (
value: FilterValues<K>,
setValue: (value: FilterValues<K>) => void,
) => ReactElement
}
const filterRenderers: FilterRenderers = {
'date-range': (value, setValue) => (
<FormattedDateRangePicker onChange={range => Array.isArray(range) && setValue(range)} />
),
select: () => null,
text: () => null,
}