TypeScript$Prepare-StructuralVsNominalTypes

45 阅读1分钟

TypeScript$Prepare-StructuralVsNominalTypes

1. Nominal Types

nominal: being sth in name only; 名义上的

多数面向对象的编程语言使用 nominal types:使用变量的时候会根据类来校验类型。类就像是“family name”,所有的实例都有同样的 “name”。

class Dog {
  public String name;
  public Dog (String name) {
    this.name = name;
  }
}

class Person {
  public String name;
  public Person (String name) {
    this.name = name;
  }
}

class Greeter {
  public static void greet (Person person) {
    System.out.println("Hello, " + person.name + "!");
  }
}

Dog dog = new Dog("Fido");
Person person = new Person("Fido");

Greeter.greet(person); // Hello, Fido!
Greeter.greet(dog); // error: incompatible types: Dog cannot be converted to Person

2. Structural Types

structural: connected with the way in which sth is built or organized; 结构(或构造)上的

人可以搬运货物,驴可以搬运货物,车也可以搬运货物。就搬运货物而言,谁搬运的重要吗?不重要,重要的是搬运货物的功能本身。

在校验一个变量的类型时,TypeScript 校验的是数据的结构:只要变量包含所需要的属性,就没有问题。如果是字面量 literal 的话,不允许有多余的属性(可能因为 TypeScript 觉得多的属性没用,是不是写错了?)。

class Dog {
  name: string
  constructor (name: string) {
    this.name = name;
  }
}

class Person {
  name: string
  constructor (name: string) {
    this.name = name;
  }
}

class Greeter {
  static greet (greetable: { name: string }) {
    console.log(`Hello, ${greetable.name}!`);
  }
}

const dog = new Dog("Fido");
const person = new Person("Fido");

Greeter.greet(person); // Hello, Fido!
Greeter.greet(dog); // Hello, Fido!