typescript 根据对象中存在的键推断键的类型

pkwftd7m  于 2023-05-01  发布在  TypeScript
关注(0)|答案(1)|浏览(135)

我有一个在输入数组中使用的类型。我需要输入类型。默认从Input的值推断。key,所以它扩展了T[key]的值。我用的是typescript 5。0.4

type Input<T, T2 extends key of T> = {
    key: T2
    default: T[key] // type is inferred from value of key
}

例如,如果T = { foo: string, bar: boolean }key = 'bar',默认值必须是布尔类型。我的需求:

var biz: Input<{ foo: string, bar: boolean }>[]

biz = [{
  key: "foo",
  default: "example"
},{
  key: "bar",
  default: true // No eror
},{
  key: "bar",
  default: "not boolean" // Errors
}]

由于biz是一个数组,因此无法手动使用类型参数:

var biz: Input<{ foo: string, bar: boolean }, "bar">[] // Added "bar" as key

biz = [{
  key: "foo",
  default: "example" // Unwanted error. Type is based on T['bar'] not T['foo']
},{
  key: "bar",
  default: true // No eror
},{
  key: "bar",
  default: "not boolean" // Errors
}]
cbwuti44

cbwuti441#

考虑以下示例:

type Shape = { foo: string, bar: boolean }

type Values<T> = T[keyof T]

type DataList<T> = Values<{
  [Prop in keyof T]: {
    key: Prop,
    default: T[Prop]
  }
}>[]

type Result = DataList<Shape>

const biz: DataList<Shape> = [{
  key: "foo",
  default: "example" // Unwanted error. Type is based on T['bar'] not T['foo']
}, {
  key: "bar",
  default: true // No eror
}, {
  key: "bar",
  default: "not boolean" // Errors
}]

Playground
您需要遍历Shape的键并创建新的Map类型,其中key是键的名称,default是类型。看这个:

[Prop in keyof T]: {
    key: Prop,
    default: T[Prop]
  }

然后需要将其 Package 到Values中,因为您对对象值感兴趣。
只需尝试删除Values Package 器并检查您拥有的内容

相关问题