Просто, чтобы прояснить ситуацию, речь идет не только о лишних проверках собственности.Избыточные проверки свойств вступают в игру, когда мы присваиваем литерал объекта непосредственно местоположению.В вашем случае все более удивительное поведение происходит при косвенном назначении объекта, что обычно разрешается при избыточных проверках свойств.
function foo(o: { bar: number }) { }
foo({ bar: 0, foo: "" }) // error direct assignment
foo({ bar:0, foo: ""} as { bar:0, foo: "" }) // ok indirect
Удивительной частью, по крайней мере для меня, является другая проверка (слабый типпроверьте) не ловит эту ошибку.При слабых проверках типов (как описано здесь ), если тип имеет только необязательные свойства, и мы пытаемся назначить тип, который не имеет общих с ним свойств, мы должны получить ошибку:
function foo(o: { bar?: number }) { }
foo({ foo: "" }) // error under excess properties: Object literal may only specify known properties, and 'foo' does not exist in type
foo({ foo: ""} as { foo: "" }) // error under weak types: Type '{ foo: ""; }' has no properties in common with type '{ bar?: number; }'.
Я думаю, что это дыра (я не решаюсь сказать, что ошибка не уверена, если это было задумано или нет) в слабых проверках типов.Слабый тип (в соответствии с этим PR ):
- Типы объектов с хотя бы одним свойством
- Где все свойства являются необязательными
- И которые не имеют сигнатуры строкового индекса, сигнатуры индекса номера, сигнатуры вызова или конструкции.
Однако при реализации проверки слабых типов для пересечений все типыпересечение должно быть слабым типом, чтобы пересечение было слабым типом.Из кода компилятора (комментарии добавлены):
function isWeakType(type: Type): boolean {
if (type.flags & TypeFlags.Object) {
// ....
}
if (type.flags & TypeFlags.Intersection) {
/// All intersection members have to be weak
return every((<IntersectionType>type).types, isWeakType);
}
return false;
}
Поскольку interface Bar {}
не является слабым типом (согласно первому правилу, он не имеет свойств), любое пересечение с ним не будет слабым типом и будетне выбрасывайте слабые ошибки проверки типов.Удаление Bar
с пересечения приведет к появлению ошибок везде, где вы назначаете объект, который не имеет ничего общего с целью.