Typescript 试图推断对象的泛型

Typescript trying to infer with generics for objects

这就是我想要完成的,但对于具有泛型的对象。 .

// Something on this lines. I know this is not supported but i am trying to convey the idea here.

type payload<T> = <K extends keyof T>{prop: K, value: T[K]};

const someObj = {a: string, b: number};

type someObjType = payload<someObj>;

const someObjPayload: someObjType = { prop: 'a', value: 'some string'} // should work.

const someObjPayload: someObjType = { prop: 'a', value: 200 } // should throw an error.

由于在 TypeScript 中只允许使用 numberstring,所以将所有内容都写两次可能会更简单 - 将类型参数 K 留在外面

type stringKeyPayload<T> = {prop: string, value: T}
type numberKeyPayload<T> = {prop: number, value: T}

不幸的是,打字稿不允许对变量进行部分推断。如果要确保该值与 key 指定的 属性 的类型相同,则需要使用辅助函数来获得适当的推理行为:

type payload<T, K extends keyof T> = {prop: K, value: T[K]};

let someObj!: {a: string, b: number};

function getProp<K extends keyof typeof someObj>(o: payload<typeof someObj, K>) {
  return o
}

const someObjPayload = getProp({ prop: 'a', value: 'some string'}) // ok of type payload<{ a: string; b: number; }, "a">

const someObjPayload2= getProp({prop: 'a', value: 100}) // error