Машинопись: определите тип T так, чтобы T & {'a': any} == R - PullRequest
0 голосов
/ 05 августа 2020

Я боролся с довольно интересной проблемой определения типов. Поскольку я изучаю 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 1 keyof ChildObj, которого нет в ParentObj.

Заранее благодарим за любую помощь и объяснения!

1 Ответ

1 голос
/ 05 августа 2020

Вам не нужно указывать Child как общий параметр c. Функция 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}
...