Взгляните на этот фрагмент:
type Constrained<T extends { [K in string]: string }> = T;
type A = {
p: string;
}
interface B {
p: string;
}
type R1 = Constrained<A>; // Why this is OK...
type R2 = Constrained<B>; // ... and this an Error?
Я знаю, что ограничение можно выразить по-другому, чтобы избежать ошибки, например,
type Constrained<T extends { [K in keyof T]: string }> = T;
и подобные решения можно найти здесь или здесь.
Главный вопрос: почему interface не работает, а type - нет?
Я предполагаю, что interface являются открытыми (их можно расширять / объединять).
Поскольку сообщение об ошибке выглядит примерно так:
Index signature is missing in type 'B'.
Думаю, этот пиар актуален. В таком случае возникает другой вопрос:
Является ли тип, объявленный с помощью type, представлением типа литерала объекта?






"тип литерала объекта" --- литерал объекта - это способ представления объекта JS в коде, это не особый тип.