打字稿:定义类型T,使T&{'a':any} == R

时间:2020-08-05 16:08:32

标签: typescript types typescript-typings typescript-generics union-types

在定义类型时,我一直在努力解决一个有趣的问题。 在学习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

在此先感谢您的帮助和解释!

1 个答案:

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