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 中只允许使用 number
和 string
,所以将所有内容都写两次可能会更简单 - 将类型参数 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
这就是我想要完成的,但对于具有泛型的对象。
// 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 中只允许使用 number
和 string
,所以将所有内容都写两次可能会更简单 - 将类型参数 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