我想玩TypeScript并且给我一个令人惊讶的(对我来说)观察。我的印象是TypeScript会对我使用类型注释的所有代码强制执行强类型操作。但事实似乎并非如此。
为什么TypeScript允许我在这里使用错误的类型实例化Car
?
class Engine {}
class Tires {}
class MockEngine {}
class Car {
engine: Engine;
tires: Tires;
constructor(engine: Engine, tires: Tires) {
this.engine = engine;
this.tires = tires;
alert("foo");
}
}
let car = new Car("foo", new Tires());
let car2 = new Car(7, new Tires());
let car3 = new Car(new MockEngine(), new Tires());
答案 0 :(得分:4)
TypeScript中的类型匹配/关联不是基于类/接口的名称,而是基于签名。通过使用空类定义,您基本上可以说它们属于任何类型,但只是将displacement: number;
添加到Engine类将会破坏下面的代码。
// consider this:
class Foo {
foo: string;
}
class Bar {
constructor(private foo: Foo){}
}
var b1 = new Bar(new Foo()); // valid
var b2 = new Bar({}); // invalid
var b3 = new Bar({foo: 'val'}); // valid