объекту интерфейса не удалось расширить запись

#typescript

#typescript

Вопрос:

почему интерфейс не удалось расширить Record

 interface Data {
  a: string
}

Data extends Record<string, unknown> ? 'yes' : 'no' // 'no'
  

однако, если я изменю данные на тип, он будет работать нормально

 type Data {
  a: string
}
 
Data extends Record<string, unknown> ? 'yes' : 'no' // 'yes'
  

Комментарии:

1. 🙂 Странное поведение. Даже если вы замените Data интерфейс в условном на DataAsType which will be: type DataGeneric<T> = T; type DataAsType = DataGeneric<Data>; результат будет тем же. Но если вы замените Data на this {[key in keyof Data]: Data[key]} , это даст yes .

Ответ №1:

type T = Record<string, unknown> вычисляется как { [x: string]: unknown; }

Типы объектов имеют неявную подпись индекса, но интерфейсы этого не делают (по соображениям безопасности), поэтому они не расширяют тип индекса.