Причина этого в том, что система типов в машинописи работает над структурной системой типов. Идея типов в некотором роде похожа на «контракты», где правила устанавливают, что определенные типы совместимы с определенными типами. Компилятор выдаст ошибку только в случае разрыва контракта. Так, например:
abstract class Base{
abstract sayHello(): void;
}
class Child extends Base{
sayHello(): number {
return 123;
}
}
Это работает, потому что, хотя наш метод возвращает число, когда мы реализуем все, что использует sayHello()
и ожидает, что он возвратит пустоту, не будет иметь побочных эффектов, контракты не нарушаются , Это просто потому, что Microsft установил правило в машинописи, говоря, что возвращаемый тип void совместим с типом возвращаемого числа. Причина в том, что, как я уже говорил, у него нет побочных эффектов, все, что ожидает от sayHello()
возврата void, должно работать должным образом.
С другой стороны, если бы я сделал что-то вроде этого:
abstract class Base{
abstract sayHello(): number;
}
class Child extends Base{
sayHello(): void {
return;
}
}
Это приведет к ошибке, потому что теперь все, что использует sayHello()
и ожидает, что оно будет числом, будет затронуто, контракт типов нарушен из-за ошибки компилятора.
Вы можете посмотреть на это как особенность гибкости в системе типов при обмене на случайную эквивалентность типов.
На языке, подобном C#, в котором используется система именных типов, это не позволит нам иметь абстрактный метод void, который при реализации возвращает строку, так как фокусируется на эквивалентности типов, типы должны быть то же самое для совместимости друг с другом.
Надеюсь, это поможет!
Система структурного типа: https://en.wikipedia.org/wiki/Structural_type_system
Система номинального типа: https://en.wikipedia.org/wiki/Nominal_type_system
Совместимость типов машинописного текста: https://www.typescriptlang.org/docs/handbook/type-compatibility.html
Spe c: https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3114 -направленность-совместимость