ä»ç»
ä¼ ç»çJavaScriptç¨åºä½¿ç¨å½æ°ååºäºååçç»§æ¿æ¥å建å¯éç¨çç»ä»¶ï¼ä½å¯¹äºçæä½¿ç¨é¢å对象æ¹å¼çç¨åºåæ¥è®²å°±æäºæ£æï¼å 为ä»ä»¬ç¨çæ¯åºäºç±»çç»§æ¿å¹¶ä¸å¯¹è±¡æ¯ç±ç±»æå»ºåºæ¥çã ä»ECMAScript 2015ï¼ä¹å°±æ¯ECMAScript 6å¼å§ï¼JavaScriptç¨åºåå°è½å¤ä½¿ç¨åºäºç±»çé¢åå¯¹è±¡çæ¹å¼ã 使ç¨TypeScriptï¼æä»¬å 许å¼åè ç°å¨å°±ä½¿ç¨è¿äºç¹æ§ï¼å¹¶ä¸ç¼è¯åçJavaScriptå¯ä»¥å¨ææä¸»æµæµè§å¨åå¹³å°ä¸è¿è¡ï¼èä¸éè¦çå°ä¸ä¸ªJavaScriptçæ¬ã
ç±»
ä¸é¢çä¸ä¸ªä½¿ç¨ç±»çä¾åï¼
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
let greeter = new Greeter("world");
å¦æä½ ä½¿ç¨è¿C#æJavaï¼ä½ ä¼å¯¹è¿ç§è¯æ³é常çæã
æä»¬å£°æä¸ä¸ªGreeterç±»ãè¿ä¸ªç±»æ3个æåï¼ä¸ä¸ªå«ågreetingç屿§ï¼ä¸ä¸ªæé 彿°åä¸ä¸ªgreetæ¹æ³ã
ä½ ä¼æ³¨æå°ï¼æä»¬å¨å¼ç¨ä»»ä½ä¸ä¸ªç±»æåçæ¶åé½ç¨äºthisã
å®è¡¨ç¤ºæä»¬è®¿é®çæ¯ç±»çæåã
æåä¸è¡ï¼æä»¬ä½¿ç¨newæé äºGreeterç±»çä¸ä¸ªå®ä¾ã
å®ä¼è°ç¨ä¹åå®ä¹çæé 彿°ï¼å建ä¸ä¸ªGreeterç±»åçæ°å¯¹è±¡ï¼å¹¶æ§è¡æé 彿°åå§åå®ã
ç»§æ¿
å¨TypeScriptéï¼æä»¬å¯ä»¥ä½¿ç¨å¸¸ç¨çé¢å对象模å¼ã åºäºç±»çç¨åºè®¾è®¡ä¸ä¸ç§æåºæ¬çæ¨¡å¼æ¯å 许使ç¨ç»§æ¿æ¥æ©å±ç°æçç±»ã
çä¸é¢çä¾åï¼
class Animal {
move(distanceInMeters: number = 0) {
console.log(`Animal moved ${distanceInMeters}m.`);
}
}
class Dog extends Animal {
bark() {
console.log('Woof! Woof!');
}
}
const dog = new Dog();
dog.bark();
dog.move(10);
dog.bark();
è¿ä¸ªä¾åå±ç¤ºäºæåºæ¬çç»§æ¿ï¼ç±»ä»åºç±»ä¸ç»§æ¿äºå±æ§åæ¹æ³ã
è¿éï¼Dogæ¯ä¸ä¸ªæ´¾çç±»ï¼å®æ´¾çèªAnimalåºç±»ï¼éè¿extendså
³é®åã
æ´¾çç±»é常被称ä½åç±»ï¼åºç±»é常被称ä½è¶
ç±»ã
å 为Dogç»§æ¿äºAnimalçåè½ï¼å æ¤æä»¬å¯ä»¥å建ä¸ä¸ªDogçå®ä¾ï¼å®è½å¤bark()åmove()ã
ä¸é¢æä»¬æ¥ç个æ´å 夿çä¾åã
class Animal {
name: string;
constructor(theName: string) { this.name = theName; }
move(distanceInMeters: number = 0) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Snake extends Animal {
constructor(name: string) { super(name); }
move(distanceInMeters = 5) {
console.log("Slithering...");
super.move(distanceInMeters);
}
}
class Horse extends Animal {
constructor(name: string) { super(name); }
move(distanceInMeters = 45) {
console.log("Galloping...");
super.move(distanceInMeters);
}
}
let sam = new Snake("Sammy the Python");
let tom: Animal = new Horse("Tommy the Palomino");
sam.move();
tom.move(34);
è¿ä¸ªä¾åå±ç¤ºäºä¸äºä¸é¢æ²¡ææå°çç¹æ§ã
è¿ä¸æ¬¡ï¼æä»¬ä½¿ç¨extendså
³é®åå建äºAnimalç两个åç±»ï¼HorseåSnakeã
ä¸åä¸ä¸ªä¾åçä¸åç¹æ¯ï¼æ´¾çç±»å
å«äºä¸ä¸ªæé 彿°ï¼å®å¿
é¡»è°ç¨super()ï¼å®ä¼æ§è¡åºç±»çæé 彿°ã
èä¸ï¼å¨æé 彿°é访é®thisç屿§ä¹åï¼æä»¬ä¸å®è¦è°ç¨super()ã
è¿ä¸ªæ¯TypeScriptå¼ºå¶æ§è¡ç䏿¡éè¦è§åã
è¿ä¸ªä¾åæ¼ç¤ºäºå¦ä½å¨åç±»éå¯ä»¥éåç¶ç±»çæ¹æ³ã
Snakeç±»åHorseç±»é½å建äºmoveæ¹æ³ï¼å®ä»¬éåäºä»Animalç»§æ¿æ¥çmoveæ¹æ³ï¼ä½¿å¾moveæ¹æ³æ ¹æ®ä¸åçç±»èå
·æä¸åçåè½ã
注æï¼å³ä½¿tom被声æä¸ºAnimalç±»åï¼ä½å 为å®ç弿¯Horseï¼è°ç¨tom.move(34)æ¶ï¼å®ä¼è°ç¨Horseééåçæ¹æ³ï¼
Slithering...
Sammy the Python moved 5m.
Galloping...
Tommy the Palomino moved 34m.
å ¬å ±ï¼ç§æä¸åä¿æ¤ç修饰符
é»è®¤ä¸ºpublic
å¨ä¸é¢çä¾åéï¼æä»¬å¯ä»¥èªç±ç访é®ç¨åºéå®ä¹çæåã
å¦æä½ å¯¹å
¶å®è¯è¨ä¸çç±»æ¯è¾äºè§£ï¼å°±ä¼æ³¨æå°æä»¬å¨ä¹åç代ç é并没æä½¿ç¨publicæ¥å修饰ï¼ä¾å¦ï¼C#è¦æ±å¿
é¡»æç¡®å°ä½¿ç¨publicæå®æåæ¯å¯è§çã
å¨TypeScriptéï¼æåé½é»è®¤ä¸ºpublicã
ä½ ä¹å¯ä»¥æç¡®çå°ä¸ä¸ªæåæ è®°æpublicã
æä»¬å¯ä»¥ç¨ä¸é¢çæ¹å¼æ¥éåä¸é¢çAnimalç±»ï¼
class Animal {
public name: string;
public constructor(theName: string) { this.name = theName; }
public move(distanceInMeters: number) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
çè§£private
彿å被æ è®°æprivateæ¶ï¼å®å°±ä¸è½å¨å£°æå®çç±»çå¤é¨è®¿é®ãæ¯å¦ï¼
class Animal {
private name: string;
constructor(theName: string) { this.name = theName; }
}
new Animal("Cat").name; // é误: 'name' æ¯ç§æç.
TypeScript使ç¨çæ¯ç»ææ§ç±»åç³»ç»ã 彿们æ¯è¾ä¸¤ç§ä¸åçç±»åæ¶ï¼å¹¶ä¸å¨ä¹å®ä»¬ä»ä½å¤èæ¥ï¼å¦ææææåçç±»å齿¯å ¼å®¹çï¼æä»¬å°±è®¤ä¸ºå®ä»¬çç±»åæ¯å ¼å®¹çã
ç¶èï¼å½æä»¬æ¯è¾å¸¦æprivateæprotectedæåçç±»åçæ¶åï¼æ
åµå°±ä¸åäºã
妿å
¶ä¸ä¸ä¸ªç±»åéå
å«ä¸ä¸ªprivateæåï¼é£ä¹åªæå½å¦å¤ä¸ä¸ªç±»åä¸ä¹åå¨è¿æ ·ä¸ä¸ªprivateæåï¼ å¹¶ä¸å®ä»¬é½æ¯æ¥èªåä¸å¤å£°ææ¶ï¼æä»¬æè®¤ä¸ºè¿ä¸¤ä¸ªç±»åæ¯å
¼å®¹çã
对äºprotectedæåä¹ä½¿ç¨è¿ä¸ªè§åã
ä¸é¢æ¥çä¸ä¸ªä¾åï¼æ´å¥½å°è¯´æäºè¿ä¸ç¹ï¼
class Animal {
private name: string;
constructor(theName: string) { this.name = theName; }
}
class Rhino extends Animal {
constructor() { super("Rhino"); }
}
class Employee {
private name: string;
constructor(theName: string) { this.name = theName; }
}
let animal = new Animal("Goat");
let rhino = new Rhino();
let employee = new Employee("Bob");
animal = rhino;
animal = employee; // é误: Animal ä¸ Employee ä¸å
¼å®¹.
è¿ä¸ªä¾å䏿AnimalåRhino两个类ï¼Rhinoæ¯Animalç±»çåç±»ã
è¿æä¸ä¸ªEmployeeç±»ï¼å
¶ç±»åçä¸å»ä¸Animalæ¯ç¸åçã
æä»¬å建äºå 个è¿äºç±»çå®ä¾ï¼å¹¶ç¸äºèµå¼æ¥ççä¼åçä»ä¹ã
å 为AnimalåRhinoå
±äº«äºæ¥èªAnimaléçç§ææåå®ä¹private name: stringï¼å æ¤å®ä»¬æ¯å
¼å®¹çã
ç¶èEmployeeå´ä¸æ¯è¿æ ·ã彿Employeeèµå¼ç»Animalçæ¶åï¼å¾å°ä¸ä¸ªé误ï¼è¯´å®ä»¬çç±»åä¸å
¼å®¹ã
尽管Employeeé乿ä¸ä¸ªç§ææånameï¼ä½å®ææ¾ä¸æ¯Animaléé¢å®ä¹çé£ä¸ªã
çè§£protected
protected修饰符ä¸private修饰符çè¡ä¸ºå¾ç¸ä¼¼ï¼ä½æä¸ç¹ä¸åï¼protectedæå卿´¾çç±»ä¸ä»ç¶å¯ä»¥è®¿é®ãä¾å¦ï¼
class Person {
protected name: string;
constructor(name: string) { this.name = name; }
}
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name)
this.department = department;
}
public getElevatorPitch() {
return `Hello, my name is ${this.name} and I work in ${this.department}.`;
}
}
let howard = new Employee("Howard", "Sales");
console.log(howard.getElevatorPitch());
console.log(howard.name); // é误
注æï¼æä»¬ä¸è½å¨Personç±»å¤ä½¿ç¨nameï¼ä½æ¯æä»¬ä»ç¶å¯ä»¥éè¿Employeeç±»çå®ä¾æ¹æ³è®¿é®ï¼å 为Employeeæ¯ç±Personæ´¾çèæ¥çã
æé 彿°ä¹å¯ä»¥è¢«æ è®°æprotectedã
è¿æå³çè¿ä¸ªç±»ä¸è½å¨å
å«å®çç±»å¤è¢«å®ä¾åï¼ä½æ¯è½è¢«ç»§æ¿ãæ¯å¦ï¼
class Person {
protected name: string;
protected constructor(theName: string) { this.name = theName; }
}
// Employee è½å¤ç»§æ¿ Person
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name);
this.department = department;
}
public getElevatorPitch() {
return `Hello, my name is ${this.name} and I work in ${this.department}.`;
}
}
let howard = new Employee("Howard", "Sales");
let john = new Person("John"); // é误: 'Person' çæé 彿°æ¯è¢«ä¿æ¤ç.
readonly修饰符
ä½ å¯ä»¥ä½¿ç¨readonlyå
³é®åå°å±æ§è®¾ç½®ä¸ºåªè¯»çã
åªè¯»å±æ§å¿
é¡»å¨å£°ææ¶ææé 彿°é被åå§åã
class Octopus {
readonly name: string;
readonly numberOfLegs: number = 8;
constructor (theName: string) {
this.name = theName;
}
}
let dad = new Octopus("Man with the 8 strong legs");
dad.name = "Man with the 3-piece suit"; // é误! name æ¯åªè¯»ç.
忰屿§
å¨ä¸é¢çä¾åä¸ï¼æä»¬ä¸å¾ä¸å®ä¹ä¸ä¸ªåä¿æ¤çæånameåä¸ä¸ªæé 彿°åæ°theNameå¨Personç±»éï¼å¹¶ä¸ç«å»ç»nameåtheNameèµå¼ã
è¿ç§æ
åµç»å¸¸ä¼éå°ã忰屿§å¯ä»¥æ¹ä¾¿å°è®©æä»¬å¨ä¸ä¸ªå°æ¹å®ä¹å¹¶åå§åä¸ä¸ªæåã
ä¸é¢çä¾åæ¯å¯¹ä¹åAnimalç±»çä¿®æ¹çï¼ä½¿ç¨äºåæ°å±æ§ï¼
class Animal {
constructor(private name: string) { }
move(distanceInMeters: number) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
注æçæä»¬æ¯å¦ä½èå¼äºtheNameï¼ä»
卿é 彿°é使ç¨private name: stringåæ°æ¥å建ååå§ånameæåã
æä»¬æå£°æåèµå¼åå¹¶è³ä¸å¤ã
忰屿§éè¿ç»æé 彿°åæ°æ·»å ä¸ä¸ªè®¿é®éå®ç¬¦æ¥å£°æã
使ç¨privateéå®ä¸ä¸ªåæ°å±æ§ä¼å£°æå¹¶åå§åä¸ä¸ªç§ææåï¼å¯¹äºpublicåprotectedæ¥è¯´ä¹æ¯ä¸æ ·ã
ååå¨
TypeScriptæ¯æéè¿getters/settersæ¥æªå对对象æåç访é®ã å®è½å¸®å©ä½ ææçæ§å¶å¯¹å¯¹è±¡æåç访é®ã
ä¸é¢æ¥çå¦ä½æä¸ä¸ªç®åçç±»æ¹åæä½¿ç¨getåsetã
é¦å
ï¼æä»¬ä»ä¸ä¸ªæ²¡æä½¿ç¨ååå¨çä¾åå¼å§ã
class Employee {
fullName: string;
}
let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
console.log(employee.fullName);
}
æä»¬å¯ä»¥éæç设置fullNameï¼è¿æ¯é常æ¹ä¾¿çï¼ä½æ¯è¿ä¹å¯è½ä¼å¸¦æ¥éº»ç¦ã
ä¸é¢è¿ä¸ªçæ¬éï¼æä»¬å
æ£æ¥ç¨æ·å¯ç æ¯å¦æ£ç¡®ï¼ç¶ååå
许å
¶ä¿®æ¹å工信æ¯ã
æä»¬æå¯¹fullNameçç´æ¥è®¿é®æ¹æäºå¯ä»¥æ£æ¥å¯ç çsetæ¹æ³ã
æä»¬ä¹å äºä¸ä¸ªgetæ¹æ³ï¼è®©ä¸é¢çä¾åä»ç¶å¯ä»¥å·¥ä½ã
let passcode = "secret passcode";
class Employee {
private _fullName: string;
get fullName(): string {
return this._fullName;
}
set fullName(newName: string) {
if (passcode && passcode == "secret passcode") {
this._fullName = newName;
}
else {
console.log("Error: Unauthorized update of employee!");
}
}
}
let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
alert(employee.fullName);
}
æä»¬å¯ä»¥ä¿®æ¹ä¸ä¸å¯ç ï¼æ¥éªè¯ä¸ä¸åå卿¯å¦æ¯å·¥ä½çãå½å¯ç ä¸å¯¹æ¶ï¼ä¼æç¤ºæä»¬æ²¡ææéå»ä¿®æ¹åå·¥ã
对äºåå卿ä¸é¢å ç¹éè¦æ³¨æçï¼
é¦å
ï¼ååå¨è¦æ±ä½ å°ç¼è¯å¨è®¾ç½®ä¸ºè¾åºECMAScript 5ææ´é«ã
䏿¯æé级å°ECMAScript 3ã
å
¶æ¬¡ï¼åªå¸¦ægetä¸å¸¦æsetçååå¨èªå¨è¢«æ¨æä¸ºreadonlyã
è¿å¨ä»ä»£ç çæ.d.tsæä»¶æ¶æ¯æå¸®å©çï¼å 为å©ç¨è¿ä¸ªå±æ§çç¨æ·ä¼çå°ä¸å
è®¸å¤æ¹åå®çå¼ã
éæå±æ§
å°ç®å为æ¢ï¼æä»¬åªè®¨è®ºäºç±»çå®ä¾æåï¼é£äºä»
å½ç±»è¢«å®ä¾åçæ¶åæä¼è¢«åå§åç屿§ã
æä»¬ä¹å¯ä»¥å建类çéææåï¼è¿äºå±æ§åå¨äºç±»æ¬èº«ä¸é¢è䏿¯ç±»çå®ä¾ä¸ã
å¨è¿ä¸ªä¾åéï¼æä»¬ä½¿ç¨staticå®ä¹originï¼å ä¸ºå®æ¯ææç½æ ¼é½ä¼ç¨å°ç屿§ã
æ¯ä¸ªå®ä¾æ³è¦è®¿é®è¿ä¸ªå±æ§çæ¶åï¼é½è¦å¨originåé¢å ä¸ç±»åã
å¦åå¨å®ä¾å±æ§ä¸ä½¿ç¨this.åç¼æ¥è®¿é®å±æ§ä¸æ ·ï¼è¿éæä»¬ä½¿ç¨Grid.æ¥è®¿é®éæå±æ§ã
class Grid {
static origin = {x: 0, y: 0};
calculateDistanceFromOrigin(point: {x: number; y: number;}) {
let xDist = (point.x - Grid.origin.x);
let yDist = (point.y - Grid.origin.y);
return Math.sqrt(xDist * xDist + yDist * yDist) / this.scale;
}
constructor (public scale: number) { }
}
let grid1 = new Grid(1.0); // 1x scale
let grid2 = new Grid(5.0); // 5x scale
console.log(grid1.calculateDistanceFromOrigin({x: 10, y: 10}));
console.log(grid2.calculateDistanceFromOrigin({x: 10, y: 10}));
æ½è±¡ç±»
æ½è±¡ç±»å为å
¶å®æ´¾çç±»çåºç±»ä½¿ç¨ã
å®ä»¬ä¸è¬ä¸ä¼ç´æ¥è¢«å®ä¾åã
ä¸åäºæ¥å£ï¼æ½è±¡ç±»å¯ä»¥å
嫿åçå®ç°ç»èã
abstractå
³é®åæ¯ç¨äºå®ä¹æ½è±¡ç±»å卿½è±¡ç±»å
é¨å®ä¹æ½è±¡æ¹æ³ã
abstract class Animal {
abstract makeSound(): void;
move(): void {
console.log('roaming the earch...');
}
}
æ½è±¡ç±»ä¸çæ½è±¡æ¹æ³ä¸å
å«å
·ä½å®ç°å¹¶ä¸å¿
须卿´¾çç±»ä¸å®ç°ã
æ½è±¡æ¹æ³çè¯æ³ä¸æ¥å£æ¹æ³ç¸ä¼¼ã
两è
齿¯å®ä¹æ¹æ³ç¾åä½ä¸å
嫿¹æ³ä½ã
ç¶èï¼æ½è±¡æ¹æ³å¿
é¡»å
å«abstractå
³é®åå¹¶ä¸å¯ä»¥å
å«è®¿é®ä¿®é¥°ç¬¦ã
abstract class Department {
constructor(public name: string) {
}
printName(): void {
console.log('Department name: ' + this.name);
}
abstract printMeeting(): void; // å¿
须卿´¾çç±»ä¸å®ç°
}
class AccountingDepartment extends Department {
constructor() {
super('Accounting and Auditing'); // 卿´¾çç±»çæé 彿°ä¸å¿
é¡»è°ç¨ super()
}
printMeeting(): void {
console.log('The Accounting Department meets each Monday at 10am.');
}
generateReports(): void {
console.log('Generating accounting reports...');
}
}
let department: Department; // å
许å建ä¸ä¸ªå¯¹æ½è±¡ç±»åçå¼ç¨
department = new Department(); // é误: ä¸è½å建ä¸ä¸ªæ½è±¡ç±»çå®ä¾
department = new AccountingDepartment(); // å
许对ä¸ä¸ªæ½è±¡åç±»è¿è¡å®ä¾ååèµå¼
department.printName();
department.printMeeting();
department.generateReports(); // é误: æ¹æ³å¨å£°æçæ½è±¡ç±»ä¸ä¸åå¨
é«çº§æå·§
æé 彿°
å½ä½ å¨TypeScripté声æäºä¸ä¸ªç±»çæ¶åï¼å®é ä¸åæ¶å£°æäºå¾å¤ä¸è¥¿ã é¦å å°±æ¯ç±»çå®ä¾çç±»åã
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
let greeter: Greeter;
greeter = new Greeter("world");
console.log(greeter.greet());
è¿éï¼æä»¬åäºlet greeter: Greeterï¼æææ¯Greeterç±»çå®ä¾çç±»åæ¯Greeterã
è¿å¯¹äºç¨è¿å
¶å®é¢å对象è¯è¨çç¨åºåæ¥è®²å·²ç»æ¯èä¹ æ¯äºã
æä»¬ä¹å建äºä¸ä¸ªå«åæé 彿°çå¼ã
è¿ä¸ªå½æ°ä¼å¨æä»¬ä½¿ç¨newå建类å®ä¾çæ¶å被è°ç¨ã
ä¸é¢æä»¬æ¥ççï¼ä¸é¢ç代ç 被ç¼è¯æJavaScript忝ä»ä¹æ ·åçï¼
let Greeter = (function () {
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
return Greeter;
})();
let greeter;
greeter = new Greeter("world");
console.log(greeter.greet());
ä¸é¢ç代ç éï¼let Greeterå°è¢«èµå¼ä¸ºæé 彿°ã
彿们è°ç¨newå¹¶æ§è¡äºè¿ä¸ªå½æ°åï¼ä¾¿ä¼å¾å°ä¸ä¸ªç±»çå®ä¾ã
è¿ä¸ªæé 彿°ä¹å
å«äºç±»çææéæå±æ§ã
æ¢ä¸ªè§åº¦è¯´ï¼æä»¬å¯ä»¥è®¤ä¸ºç±»å
·æå®ä¾é¨åä¸éæé¨åè¿ä¸¤ä¸ªé¨åã
让æä»¬ç¨å¾®æ¹åä¸ä¸è¿ä¸ªä¾åï¼ççå®ä»¬ä¹åçåºå«ï¼
class Greeter {
static standardGreeting = "Hello, there";
greeting: string;
greet() {
if (this.greeting) {
return "Hello, " + this.greeting;
}
else {
return Greeter.standardGreeting;
}
}
}
let greeter1: Greeter;
greeter1 = new Greeter();
console.log(greeter1.greet());
let greeterMaker: typeof Greeter = Greeter;
greeterMaker.standardGreeting = "Hey there!";
let greeter2: Greeter = new greeterMaker();
console.log(greeter2.greet());
è¿ä¸ªä¾åéï¼greeter1ä¸ä¹åçå°ç䏿 ·ã
æä»¬å®ä¾åGreeterç±»ï¼å¹¶ä½¿ç¨è¿ä¸ªå¯¹è±¡ã
䏿们ä¹åçå°ç䏿 ·ã
åä¹åï¼æä»¬ç´æ¥ä½¿ç¨ç±»ã
æä»¬å建äºä¸ä¸ªå«ågreeterMakerçåéã
è¿ä¸ªåéä¿åäºè¿ä¸ªç±»æè
说ä¿åäºç±»æé 彿°ã
ç¶åæä»¬ä½¿ç¨typeof Greeterï¼æææ¯åGreeterç±»çç±»åï¼è䏿¯å®ä¾çç±»åã
æè
æ´ç¡®åç说ï¼âåè¯æGreeteræ è¯ç¬¦çç±»åâï¼ä¹å°±æ¯æé 彿°çç±»åã
è¿ä¸ªç±»åå
å«äºç±»çææéææååæé 彿°ã
ä¹åï¼å°±ååé¢ä¸æ ·ï¼æä»¬å¨greeterMakerä¸ä½¿ç¨newï¼å建Greeterçå®ä¾ã
æç±»å½åæ¥å£ä½¿ç¨
å¦ä¸ä¸èéæè®²çï¼ç±»å®ä¹ä¼å建两个ä¸è¥¿ï¼ç±»çå®ä¾ç±»ååä¸ä¸ªæé 彿°ã å 为类å¯ä»¥å建åºç±»åï¼æä»¥ä½ è½å¤å¨å è®¸ä½¿ç¨æ¥å£çå°æ¹ä½¿ç¨ç±»ã
class Point {
x: number;
y: number;
}
interface Point3d extends Point {
z: number;
}
let point3d: Point3d = {x: 1, y: 2, z: 3};