TypeScript:Record <>,其中值取决于键

时间:2020-04-24 07:59:48

标签: typescript

我想写这样的东西:

measurement

其中const structs: Record<T extends StructureConstant,Array<ConcreteStructure<T>>> = Object.create(null); 是常量的并集,而StructureConstant基本上是type lookup

在TypeScript中可以这样做吗?我不知道如何使值取决于键。


这是一个完整的例子:

ConcreteStructure

TS playground

2 个答案:

答案 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>()

Playground


要获得上述效果,您不能使用唱片。记录将所有键映射到相同的类型。如果每个条目都需要不同的类型,则需要自定义映射类型

type StuctureMappedType<T extends StructureConstant> = 
    { [K in T]: Array<ConcreteStructure<K>>}

Playground

答案 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,
}