在定义类型时,我一直在努力解决一个有趣的问题。 在学习TS时,请记住,我也在寻找一种解释或参考。
按照标题,我定义了一个函数:
function make<ChildObj extends ParentObj, ParentObj, Missingkey extends string>(
parentObj: ParentObj, // Only 1 key is missing to make ChildObj become ParentObj
missingKey: MissingKey,
): ChildObj {
const missingKeyValue = Math.random();
doSomething({ // doSomething expects the first parameter to be of type ChildObj
...childObj,
[missingKey]: missingKeyValue
});
}
用法示例:
type ParentObj = {a: any};
type ChildObj = {a: any, b: any};
make<ParentObj, ChildObj, 'x'>({a: 0}, 'x') // Invalid because ParentObj & {'x': any} is not ChildObj
make<ParentObj, ChildObj, 'b'>({a: 0}, 'b') // Valid
因此,简而言之,我需要约束missingKey
成为keyof
没有的1 ChildObj
ParentObj
。
在此先感谢您的帮助和解释!
答案 0 :(得分:1)
您不需要将Child指定为通用参数。函数make
仅返回Parent
和带有附加键的对象的交集。
function make<T extends object, K extends string>(parent: T, key: K) {
return {
...parent,
[key]: Math.random(),
} as T & { [P in K]: number };
}
const a = make({x: 1}, 'y'); // type: {x: number} & {y: number}