为什么没有打字稿强制我的类用正确的类型实例化?

时间:2015-09-02 10:33:17

标签: typescript

我想玩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());

Runnable Code

1 个答案:

答案 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

See above code in the TypeScript Playground