#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 {}
, которая будет принимать без ошибок типа aRecord<string, any>
, независимо от того, передается ли она как литерал или как значение, привязанное к имени.5. Не в соответствии с этим это не так . Не могли бы вы пояснить, что вы имеете в виду? Может быть, я неправильно понимаю.