У меня возникли проблемы с использованием условного типа в сочетании с именем свойства вычисляемого объекта. В основном я вставляю строки в базу данных на основе входной строки. Затем я набираю возвращаемый объект на основе этой входной строки. Одно из свойств возвращаемого объекта - это вычисленное имя, которое также основано на входной строке. Похоже, что в машинописном тексте есть вся информация, необходимая для проверки, что это правильно, но он продолжает выдавать мне ошибки. Вот очень упрощенный пример.
//types of the table rows from the database
interface FirstTableRow {
id: number,
someFirstRefId: number
};
interface SecondTableRow {
id: number,
someSecondRefId: number
};
//maps which table we're working with to its reference column name
const whichToExtraColumn = {
first: 'someFirstRefId',
second: 'someSecondRefId'
} as const;
//maps the table to the returned row type
type ConstToObj<T> = (T extends 'first'
? FirstTableRow
: T extends 'second'
? SecondTableRow
: never
);
function createFirstOrSecond<
T extends keyof typeof whichToExtraColumn
>(
which: T
): ConstToObj<T> {
//gets the reference column name for this table
const refColumn = whichToExtraColumn[which];
//do database stuff....
const insertId = 1;
//build the inserted row
const test: ConstToObj<T> = {
id: insertId,
[refColumn]: 123
};
// ^ Type '{ [x: string]: number; id: number; }' is not assignable to type 'ConstToObj<T>'
return test;
};
Я нашел обходной путь, выполнив if-check для refColumn
, а затем сгенерировав разные объекты в зависимости от этого. Но было бы проще использовать вычисленное имя свойства. Любая помощь будет оценена по достоинству.
"first" | "second"
является допустимым подтипомkeyof typeof whichToExtraColumn
, поэтомуConstToObj<T>
может бытьFirstTableRow | SecondTableRow
, и объект не может быть ему назначен. К сожалению, сообщение об ошибке очень короткое, поэтому трудно сказать, почему именно это несоответствие (приведенное выше является предположением) - person Jonas Wilms   schedule 12.04.2021