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!