Почему «Запись» может быть назначена » Записи` без ошибок типа?

#typescript #polymorphism

Вопрос:

Следующее назначение приводит к ошибке типа:

 const t: Record<number, any> = { key: 'value'}
 

Это ожидаемое поведение. Однако следующее назначение неожиданно не приводит к ошибке типа.

 const c: Record<string, any> = { key: 'value'}
const t: Record<number, any> = c
 

Как так получилось? Я подозреваю , что это как-то связано с тем, как работает полиморфизм Record , но я не могу найти никакой документации по этому вопросу.

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

1. Это больше связано с типом индекса, к которому относится TS Record typescriptlang.org/docs/handbook/…

2. Это имеет мало общего с Record самим по себе и во многом связано с избыточными проверками свойств , применяемыми только к объектным литералам. Есть много ситуаций, в которых const foo: Foo = {bar: 123} терпит неудачу, но const bar = {bar: 123}; const foo: Foo = bar; добивается успеха. Я рад написать ответ, но мне интересно, следует ли просто отметить это как дубликат существующего вопроса об ошибках избыточных свойств.

3. …не то чтобы я нашел хороший существующий вопрос, который подходит для этого. Я думаю, что напишу ответ, если никто не придет сюда первым (и любой, кто это сделает, более чем рад это сделать!)

4. @jcalz Я не уверен, что это объясняется избыточными проверками собственности. Вопрос все еще стоит в случае функции function f(_: Record<number, any>): void {} , которая будет принимать без ошибок типа a Record<string, any> , независимо от того, передается ли она как литерал или как значение, привязанное к имени.

5. Не в соответствии с этим это не так . Не могли бы вы пояснить, что вы имеете в виду? Может быть, я неправильно понимаю.