以下代码会在 Java 中产生预期的类型错误,但 TypeScript 并不认为这是错误。这是设计使然,还是 TypeScript 中的错误?
abstract class UnitType<T extends UnitType<T>> {
...
}
class Unit<T extends UnitType<T>> {
...
}
class Length extends UnitType<Length> {
static meters: Unit<Length> = new Unit<Length>()
}
class Angle extends UnitType<Angle> {
static degrees: Unit<Angle> = new Unit<Angle>()
}
class UnitizedNumber<T extends UnitType<T>> {
constructor(value: number, unit: Unit<T>) {
...
}
}
// Length and Angle are not compatible, so this should be an error.
const foo: UnitizedNumber<Length> = new UnitizedNumber<Length>(1, Angle.degrees)
事实上,TypeScript 甚至不认为这是一个错误:
const meters: Length = new Angle()
TypeScript 是否将所有类视为结构类型而不是名义类型?我习惯于 Java 和 Flow 将类视为名义类型。