Дженерики typescript, почему такой код выдаёт ошибку Type '{}' is not assignable to type?

Никак не могу понять почему такой код выдаёт ошибку - Type '{}' is not assignable to type 'Keys<T>'.

type Keys<T extends string|symbol>={
    [key in T]: string;
};
const foo = <T extends string|symbol>()=>{
    const a:Keys<T> = {}
    return a
}

Причем если подставить вручную тип string или symbol, никаких ошибок получено не будет. Лишь предупреждение о том, что T для функции объявлен, но не используется.

Пример рабочих кодов:

type Keys<T extends string|symbol>={
    [key in T]: string;
};
const foo = <T extends string|symbol>()=>{
    const a:Keys<string> = {}
    return a
}
type Keys<T extends string|symbol>={
    [key in T]: string;
};
const foo = <T extends string|symbol>()=>{
    const a:Keys<symbol> = {}
    return a
}

Вы можете проверить код здесь


Ответы (1 шт):

Автор решения: Ivan Domnich

type Keys<T extends string|symbol> - T это обобщенный тип, т.е. при использовании такого type нужно будет явно указать тип (заменить T на нужный тип данных). Ты получаешь ошибку, т.к. используешь свой генерик c 'обобщенным' типом. И соответсвенно не получаешь ошибку, когда подставляешь Key<string>

Мне кажется, что по задумке, ты хотел сделать что то вроде

type Keys<T extends string | symbol> = Record<T, string>;

const a: Keys<symbol> = {
  [Symbol('id')] = '12345'
}

Или даже

const a: Record<symbol, string> = ....
→ Ссылка