为什么';t typescript是否强制使用正确的类型实例化我的类?

为什么';t typescript是否强制使用正确的类型实例化我的类?,typescript,Typescript,我想玩打字脚本,并做出了一个令人惊讶的观察(对我来说!)。我的印象是,TypeScript将对我所有使用类型注释的代码强制执行强类型。但事实似乎并非如此 为什么TypeScript允许我在这里用错误的类型实例化Car class Engine {} class Tires {} class MockEngine {} class Car { engine: Engine; tires: Tires; constructor(engine: Engine, tires: Tir

我想玩打字脚本,并做出了一个令人惊讶的观察(对我来说!)。我的印象是,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());

TypeScript中的类型匹配/关联不是基于类/接口的名称,而是基于签名。通过使用空的类定义,基本上可以说它们是任何类型的,但只需添加
displacement:number到引擎类将破坏下面的代码

// 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

TypeScript中的类型匹配/关联不是基于类/接口的名称,而是基于签名。通过使用空的类定义,基本上可以说它们是任何类型的,但只需添加
displacement:number到引擎类将破坏下面的代码

// 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

提示:在Brocco示例中,您可以通过在每个参数前添加“private”或“public”前缀来节省大量代码的输入,因此这会自动定义类属性并为属性分配参数。提示:在Brocco示例中,您可以通过添加“private”或“public”前缀来节省大量代码的输入在每个参数之前加上“public”前缀,这样可以自动定义类属性并将参数分配给属性。