ä»ç»
TypeScriptçæ ¸å¿ååä¹ä¸æ¯å¯¹å¼æå ·æçç»æè¿è¡ç±»åæ£æ¥ã 宿æ¶è¢«ç§°åâé¸å¼è¾¨åæ³âæâç»ææ§åç±»ååâã å¨TypeScriptéï¼æ¥å£çä½ç¨å°±æ¯ä¸ºè¿äºç±»åå½ååä¸ºä½ çä»£ç æç¬¬ä¸æ¹ä»£ç å®ä¹å¥çº¦ã
æ¥å£åæ¢
ä¸é¢éè¿ä¸ä¸ªç®åç¤ºä¾æ¥è§å¯æ¥å£æ¯å¦ä½å·¥ä½çï¼
function printLabel(labelledObj: { label: string }) {
console.log(labelledObj.label);
}
let myObj = { size: 10, label: "Size 10 Object" };
printLabel(myObj);
ç±»åæ£æ¥å¨ä¼æ¥çprintLabelçè°ç¨ã
printLabelæä¸ä¸ªåæ°ï¼å¹¶è¦æ±è¿ä¸ªå¯¹è±¡åæ°æä¸ä¸ªå为labelç±»å为stringç屿§ã
éè¦æ³¨æçæ¯ï¼æä»¬ä¼ å
¥çå¯¹è±¡åæ°å®é
ä¸ä¼å
å«å¾å¤å±æ§ï¼ä½æ¯ç¼è¯å¨åªä¼æ£æ¥é£äºå¿
éç屿§æ¯å¦åå¨ï¼å¹¶ä¸å
¶ç±»åæ¯å¦å¹é
ã
ç¶èï¼æäºæ¶åTypeScriptå´å¹¶ä¸ä¼è¿ä¹å®½æ¾ï¼æä»¬ä¸é¢ä¼ç¨å讲解ã
ä¸é¢æä»¬éåä¸é¢çä¾åï¼è¿æ¬¡ä½¿ç¨æ¥å£æ¥æè¿°ï¼å¿
é¡»å
å«ä¸ä¸ªlabel屿§ä¸ç±»å为stringï¼
interface LabelledValue {
label: string;
}
function printLabel(labelledObj: LabelledValue) {
console.log(labelledObj.label);
}
let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);
LabelledValueæ¥å£å°±å¥½æ¯ä¸ä¸ªååï¼ç¨æ¥æè¿°ä¸é¢ä¾åéçè¦æ±ã
å®ä»£è¡¨äºæä¸ä¸ªlabel屿§ä¸ç±»å为stringç对象ã
éè¦æ³¨æçæ¯ï¼æä»¬å¨è¿éå¹¶ä¸è½åå¨å
¶å®è¯è¨é䏿 ·ï¼è¯´ä¼ ç»printLabelç对象å®ç°äºè¿ä¸ªæ¥å£ãæä»¬åªä¼å»å
³æ³¨å¼çå¤å½¢ã
åªè¦ä¼ å
¥ç对象满足ä¸é¢æå°çå¿
è¦æ¡ä»¶ï¼é£ä¹å®å°±æ¯è¢«å
许çã
è¿æä¸ç¹å¼å¾æçæ¯ï¼ç±»åæ£æ¥å¨ä¸ä¼å»æ£æ¥å±æ§ç顺åºï¼åªè¦ç¸åºç屿§åå¨å¹¶ä¸ç±»å乿¯å¯¹çå°±å¯ä»¥ã
å¯é屿§
æ¥å£éç屿§ä¸å ¨é½æ¯å¿ éçã æäºæ¯åªå¨æäºæ¡ä»¶ä¸åå¨ï¼æè æ ¹æ¬ä¸åå¨ã å¯é屿§å¨åºç¨âoption bagsâæ¨¡å¼æ¶å¾å¸¸ç¨ï¼å³ç»å½æ°ä¼ å ¥çåæ°å¯¹è±¡ä¸åªæé¨å屿§èµå¼äºã
ä¸é¢æ¯åºç¨äºâoption bagsâçä¾åï¼
interface SquareConfig {
color?: string;
width?: number;
}
function createSquare(config: SquareConfig): {color: string; area: number} {
let newSquare = {color: "white", area: 100};
if (config.color) {
newSquare.color = config.color;
}
if (config.width) {
newSquare.area = config.width * config.width;
}
return newSquare;
}
let mySquare = createSquare({color: "black"});
带æå¯é屿§çæ¥å£ä¸æ®éçæ¥å£å®ä¹å·®ä¸å¤ï¼åªæ¯å¨å¯é屿§ååå®ä¹çåé¢å ä¸ä¸ª?符å·ã
å¯é屿§ç好å¤ä¹ä¸æ¯å¯ä»¥å¯¹å¯è½åå¨ç屿§è¿è¡é¢å®ä¹ï¼å¥½å¤ä¹äºæ¯å¯ä»¥æè·å¼ç¨äºä¸åå¨ç屿§æ¶çé误ã
æ¯å¦ï¼æä»¬æ
æå°createSquareéçcolor屿§åæ¼éï¼å°±ä¼å¾å°ä¸ä¸ªé误æç¤ºï¼
interface SquareConfig {
color?: string;
width?: number;
}
function createSquare(config: SquareConfig): { color: string; area: number } {
let newSquare = {color: "white", area: 100};
if (config.color) {
// Error: Property 'clor' does not exist on type 'SquareConfig'
newSquare.color = config.clor;
}
if (config.width) {
newSquare.area = config.width * config.width;
}
return newSquare;
}
let mySquare = createSquare({color: "black"});
åªè¯»å±æ§
ä¸äºå¯¹è±¡å±æ§åªè½å¨å¯¹è±¡åååå»ºçæ¶åä¿®æ¹å
¶å¼ã
ä½ å¯ä»¥å¨å±æ§ååç¨readonlyæ¥æå®åªè¯»å±æ§:
interface Point {
readonly x: number;
readonly y: number;
}
ä½ å¯ä»¥éè¿èµå¼ä¸ä¸ªå¯¹è±¡åé¢éæ¥æé ä¸ä¸ªPointã
èµå¼åï¼xåyåä¹ä¸è½è¢«æ¹åäºã
let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error!
TypeScriptå
·æReadonlyArray<T>ç±»åï¼å®ä¸Array<T>ç¸ä¼¼ï¼åªæ¯æææå¯åæ¹æ³å»æäºï¼å æ¤å¯ä»¥ç¡®ä¿æ°ç»å建ååä¹ä¸è½è¢«ä¿®æ¹ï¼
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!
ä¸é¢ä»£ç çæåä¸è¡ï¼å¯ä»¥çå°å°±ç®ææ´ä¸ªReadonlyArrayèµå¼å°ä¸ä¸ªæ®éæ°ç»ä¹æ¯ä¸å¯ä»¥çã
使¯ä½ å¯ä»¥ç¨ç±»åæè¨éåï¼
a = ro as number[];
readonly vs const
æç®åå¤æè¯¥ç¨readonlyè¿æ¯constçæ¹æ³æ¯çè¦æå®å为åé使ç¨è¿æ¯å为ä¸ä¸ªå±æ§ã
å为åé使ç¨çè¯ç¨constï¼è¥åä¸ºå±æ§å使ç¨readonlyã
é¢å¤ç屿§æ£æ¥
æä»¬å¨ç¬¬ä¸ä¸ªä¾åé使ç¨äºæ¥å£ï¼TypeScript让æä»¬ä¼ å
¥{ size: number; label: string; }å°ä»
ææå¾å°{ label: string; }ç彿°éã
æä»¬å·²ç»å¦è¿äºå¯é屿§ï¼å¹¶ä¸ç¥éä»ä»¬å¨âoption bagsâæ¨¡å¼é徿ç¨ã
ç¶èï¼å¤©çå°å°è¿ä¸¤è
ç»åçè¯å°±ä¼åå¨JavaScripté飿 ·æ¬èµ·ç³å¤´ç ¸èªå·±çèã
æ¯å¦ï¼æ¿createSquareä¾åæ¥è¯´ï¼
interface SquareConfig {
color?: string;
width?: number;
}
function createSquare(config: SquareConfig): { color: string; area: number } {
// ...
}
let mySquare = createSquare({ colour: "red", width: 100 });
注æä¼ å
¥createSquareçåæ°æ¼å为colourè䏿¯colorã
å¨JavaScriptéï¼è¿ä¼é»é»å°å¤±è´¥ã
ä½ å¯è½ä¼äºè¾©è¿ä¸ªç¨åºå·²ç»æ£ç¡®å°ç±»ååäºï¼å 为width屿§æ¯å
¼å®¹çï¼ä¸åå¨color屿§ï¼èä¸é¢å¤çcolour屿§æ¯æ æä¹çã
ç¶èï¼TypeScriptä¼è®¤ä¸ºè¿æ®µä»£ç å¯è½åå¨bugã 对象åé¢éä¼è¢«ç¹æ®å¯¹å¾ èä¸ä¼ç»è¿é¢å¤å±æ§æ£æ¥ï¼å½å°å®ä»¬èµå¼ç»åéæä½ä¸ºåæ°ä¼ éçæ¶åã 妿ä¸ä¸ªå¯¹è±¡åé¢éåå¨ä»»ä½âç®æ ç±»åâä¸å å«ç屿§æ¶ï¼ä½ ä¼å¾å°ä¸ä¸ªé误ã
// error: 'colour' not expected in type 'SquareConfig'
let mySquare = createSquare({ colour: "red", width: 100 });
ç»å¼è¿äºæ£æ¥é常ç®åã æç®ä¾¿çæ¹æ³æ¯ä½¿ç¨ç±»åæè¨ï¼
let mySquare = createSquare({ width: 100, opacity: 0.5 } as SquareConfig);
ç¶èï¼æä½³çæ¹å¼æ¯è½å¤æ·»å ä¸ä¸ªå符串索å¼ç¾åï¼åææ¯ä½ è½å¤ç¡®å®è¿ä¸ªå¯¹è±¡å¯è½å
·ææäºåä¸ºç¹æ®ç¨é使ç¨çé¢å¤å±æ§ã
妿SquareConfig带æä¸é¢å®ä¹çç±»åçcoloråwidth屿§ï¼å¹¶ä¸è¿ä¼å¸¦æä»»ææ°éçå
¶å®å±æ§ï¼é£ä¹æä»¬å¯ä»¥è¿æ ·å®ä¹å®ï¼
interface SquareConfig {
color?: string;
width?: number;
[propName: string]: any;
}
æä»¬ç¨åä¼è®²å°ç´¢å¼ç¾åï¼ä½å¨è¿æä»¬è¦è¡¨ç¤ºçæ¯SquareConfigå¯ä»¥æä»»ææ°éç屿§ï¼å¹¶ä¸åªè¦å®ä»¬ä¸æ¯coloråwidthï¼é£ä¹å°±æ æè°å®ä»¬çç±»åæ¯ä»ä¹ã
è¿ææåä¸ç§è·³è¿è¿äºæ£æ¥çæ¹å¼ï¼è¿å¯è½ä¼è®©ä½ æå°æè®¶ï¼å®å°±æ¯å°è¿ä¸ªå¯¹è±¡èµå¼ç»ä¸ä¸ªå¦ä¸ä¸ªåéï¼
å 为squareOptionsä¸ä¼ç»è¿é¢å¤å±æ§æ£æ¥ï¼æä»¥ç¼è¯å¨ä¸ä¼æ¥éã
let squareOptions = { colour: "red", width: 100 };
let mySquare = createSquare(squareOptions);
è¦çæï¼å¨åä¸é¢ä¸æ ·çç®å代ç éï¼ä½ å¯è½ä¸åºè¯¥å»ç»å¼è¿äºæ£æ¥ã
对äºå
嫿¹æ³åå
é¨ç¶æçå¤æå¯¹è±¡åé¢éæ¥è®²ï¼ä½ å¯è½éè¦ä½¿ç¨è¿äºæå·§ï¼ä½æ¯å¤§é¨é¢å¤å±æ§æ£æ¥é误æ¯çæ£çbugã
å°±æ¯è¯´ä½ éå°äºé¢å¤ç±»åæ£æ¥åºçéè¯¯ï¼æ¯å¦âoption bagsâï¼ä½ åºè¯¥å»å®¡æ¥ä¸ä¸ä½ çç±»å声æã
å¨è¿éï¼å¦ææ¯æä¼ å
¥coloræcolour屿§å°createSquareï¼ä½ åºè¯¥ä¿®æ¹SquareConfigå®ä¹æ¥ä½ç°åºè¿ä¸ç¹ã
彿°ç±»å
æ¥å£è½å¤æè¿°JavaScriptä¸å¯¹è±¡æ¥æçåç§åæ ·çå¤å½¢ã é¤äºæè¿°å¸¦æå±æ§çæ®é对象å¤ï¼æ¥å£ä¹å¯ä»¥æè¿°å½æ°ç±»åã
为äºä½¿ç¨æ¥å£è¡¨ç¤ºå½æ°ç±»åï¼æä»¬éè¦ç»æ¥å£å®ä¹ä¸ä¸ªè°ç¨ç¾åã å®å°±åæ¯ä¸ä¸ªåªæåæ°å表åè¿åå¼ç±»åç彿°å®ä¹ãåæ°å表éçæ¯ä¸ªåæ°é½éè¦åååç±»åã
interface SearchFunc {
(source: string, subString: string): boolean;
}
è¿æ ·å®ä¹åï¼æä»¬å¯ä»¥å使ç¨å ¶å®æ¥å£ä¸æ ·ä½¿ç¨è¿ä¸ªå½æ°ç±»åçæ¥å£ã ä¸ä¾å±ç¤ºäºå¦ä½å建ä¸ä¸ªå½æ°ç±»åçåéï¼å¹¶å°ä¸ä¸ªåç±»åç彿°èµå¼ç»è¿ä¸ªåéã
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
let result = source.search(subString);
return result > -1;
}
对äºå½æ°ç±»åçç±»åæ£æ¥æ¥è¯´ï¼å½æ°çåæ°åä¸éè¦ä¸æ¥å£éå®ä¹çååç¸å¹é ã æ¯å¦ï¼æä»¬ä½¿ç¨ä¸é¢ç代ç éåä¸é¢çä¾åï¼
let mySearch: SearchFunc;
mySearch = function(src: string, sub: string): boolean {
let result = src.search(sub);
return result > -1;
}
彿°çåæ°ä¼é个è¿è¡æ£æ¥ï¼è¦æ±å¯¹åºä½ç½®ä¸çåæ°ç±»åæ¯å
¼å®¹çã
å¦æä½ ä¸æ³æå®ç±»åï¼TypeScriptçç±»åç³»ç»ä¼æ¨æåºåæ°ç±»åï¼å ä¸ºå½æ°ç´æ¥èµå¼ç»äºSearchFuncç±»ååéã
彿°çè¿åå¼ç±»åæ¯éè¿å
¶è¿å弿¨æåºæ¥çï¼æ¤ä¾æ¯falseåtrueï¼ã
å¦æè®©è¿ä¸ªå½æ°è¿åæ°åæå符串ï¼ç±»åæ£æ¥å¨ä¼è¦åæä»¬å½æ°çè¿åå¼ç±»åä¸SearchFuncæ¥å£ä¸çå®ä¹ä¸å¹é
ã
let mySearch: SearchFunc;
mySearch = function(src, sub) {
let result = src.search(sub);
return result > -1;
}
å¯ç´¢å¼çç±»å
ä¸ä½¿ç¨æ¥å£æè¿°å½æ°ç±»åå·®ä¸å¤ï¼æä»¬ä¹å¯ä»¥æè¿°é£äºè½å¤âéè¿ç´¢å¼å¾å°âçç±»åï¼æ¯å¦a[10]æageMap["daniel"]ã
å¯ç´¢å¼ç±»åå
·æä¸ä¸ªç´¢å¼ç¾åï¼å®æè¿°äºå¯¹è±¡ç´¢å¼çç±»åï¼è¿æç¸åºçç´¢å¼è¿åå¼ç±»åã
让æä»¬çä¸ä¸ªä¾åï¼
interface StringArray {
[index: number]: string;
}
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];
ä¸é¢ä¾åéï¼æä»¬å®ä¹äºStringArrayæ¥å£ï¼å®å
·æç´¢å¼ç¾åã
è¿ä¸ªç´¢å¼ç¾å表示äºå½ç¨numberå»ç´¢å¼StringArrayæ¶ä¼å¾å°stringç±»åçè¿åå¼ã
å
±ææ¯æä¸¤ç§ç´¢å¼ç¾åï¼åç¬¦ä¸²åæ°åã
å¯ä»¥åæ¶ä½¿ç¨ä¸¤ç§ç±»åçç´¢å¼ï¼ä½æ¯æ°åç´¢å¼çè¿åå¼å¿
é¡»æ¯å符串索å¼è¿åå¼ç±»åçåç±»åã
è¿æ¯å 为å½ä½¿ç¨numberæ¥ç´¢å¼æ¶ï¼JavaScriptä¼å°å®è½¬æ¢æstringç¶ååå»ç´¢å¼å¯¹è±¡ã
ä¹å°±æ¯è¯´ç¨100ï¼ä¸ä¸ªnumberï¼å»ç´¢å¼çåäºä½¿ç¨"100"ï¼ä¸ä¸ªstringï¼å»ç´¢å¼ï¼å æ¤ä¸¤è
éè¦ä¿æä¸è´ã
class Animal {
name: string;
}
class Dog extends Animal {
breed: string;
}
// é误ï¼ä½¿ç¨'string'ç´¢å¼ï¼ææ¶ä¼å¾å°Animal!
interface NotOkay {
[x: number]: Animal;
[x: string]: Dog;
}
å符串索å¼ç¾åè½å¤å¾å¥½çæè¿°dictionary模å¼ï¼å¹¶ä¸å®ä»¬ä¹ä¼ç¡®ä¿ææå±æ§ä¸å
¶è¿åå¼ç±»åç¸å¹é
ã
å 为å符串索å¼å£°æäºobj.propertyåobj["property"]两ç§å½¢å¼é½å¯ä»¥ã
ä¸é¢çä¾åéï¼nameçç±»åä¸å符串索å¼ç±»åä¸å¹é
ï¼æä»¥ç±»åæ£æ¥å¨ç»åºä¸ä¸ªé误æç¤ºï¼
interface NumberDictionary {
[index: string]: number;
length: number; // å¯ä»¥ï¼lengthæ¯numberç±»å
name: string // é误ï¼`name`çç±»åä¸ç´¢å¼ç±»åè¿åå¼çç±»åä¸å¹é
}
æåï¼ä½ å¯ä»¥å°ç´¢å¼ç¾å设置为åªè¯»ï¼è¿æ ·å°±é²æ¢äºç»ç´¢å¼èµå¼ï¼
interface ReadonlyStringArray {
readonly [index: number]: string;
}
let myArray: ReadonlyStringArray = ["Alice", "Bob"];
myArray[2] = "Mallory"; // error!
ä½ ä¸è½è®¾ç½®myArray[2]ï¼å 为索å¼ç¾åæ¯åªè¯»çã
类类å
å®ç°æ¥å£
ä¸C#æJava鿥å£çåºæ¬ä½ç¨ä¸æ ·ï¼TypeScriptä¹è½å¤ç¨å®æ¥æç¡®ç强å¶ä¸ä¸ªç±»å»ç¬¦åæç§å¥çº¦ã
interface ClockInterface {
currentTime: Date;
}
class Clock implements ClockInterface {
currentTime: Date;
constructor(h: number, m: number) { }
}
ä½ ä¹å¯ä»¥å¨æ¥å£ä¸æè¿°ä¸ä¸ªæ¹æ³ï¼å¨ç±»éå®ç°å®ï¼å¦åä¸é¢çsetTimeæ¹æ³ä¸æ ·ï¼
interface ClockInterface {
currentTime: Date;
setTime(d: Date);
}
class Clock implements ClockInterface {
currentTime: Date;
setTime(d: Date) {
this.currentTime = d;
}
constructor(h: number, m: number) { }
}
æ¥å£æè¿°äºç±»çå ¬å ±é¨åï¼è䏿¯å ¬å ±åç§æä¸¤é¨åã å®ä¸ä¼å¸®ä½ æ£æ¥ç±»æ¯å¦å ·ææäºç§ææåã
ç±»éæé¨åä¸å®ä¾é¨åçåºå«
å½ä½ æä½ç±»åæ¥å£çæ¶åï¼ä½ è¦ç¥éç±»æ¯å ·æä¸¤ä¸ªç±»åçï¼éæé¨åçç±»ååå®ä¾çç±»åã ä½ ä¼æ³¨æå°ï¼å½ä½ ç¨æé å¨ç¾åå»å®ä¹ä¸ä¸ªæ¥å£å¹¶è¯å¾å®ä¹ä¸ä¸ªç±»å»å®ç°è¿ä¸ªæ¥å£æ¶ä¼å¾å°ä¸ä¸ªé误ï¼
interface ClockConstructor {
new (hour: number, minute: number);
}
class Clock implements ClockConstructor {
currentTime: Date;
constructor(h: number, m: number) { }
}
è¿éå 为å½ä¸ä¸ªç±»å®ç°äºä¸ä¸ªæ¥å£æ¶ï¼åªå¯¹å ¶å®ä¾é¨åè¿è¡ç±»åæ£æ¥ã constructoråå¨äºç±»çéæé¨åï¼æä»¥ä¸å¨æ£æ¥çèå´å ã
å æ¤ï¼æä»¬åºè¯¥ç´æ¥æä½ç±»çéæé¨åã
çä¸é¢çä¾åï¼æä»¬å®ä¹äºä¸¤ä¸ªæ¥å£ï¼ClockConstructor为æé 彿°æç¨åClockInterface为å®ä¾æ¹æ³æç¨ã
ä¸ºäºæ¹ä¾¿æä»¬å®ä¹ä¸ä¸ªæé 彿°createClockï¼å®ç¨ä¼ å
¥çç±»åå建å®ä¾ã
interface ClockConstructor {
new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
tick();
}
function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
return new ctor(hour, minute);
}
class DigitalClock implements ClockInterface {
constructor(h: number, m: number) { }
tick() {
console.log("beep beep");
}
}
class AnalogClock implements ClockInterface {
constructor(h: number, m: number) { }
tick() {
console.log("tick tock");
}
}
let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);
å 为createClockç第ä¸ä¸ªåæ°æ¯ClockConstructorç±»åï¼å¨createClock(AnalogClock, 7, 32)éï¼ä¼æ£æ¥AnalogClockæ¯å¦ç¬¦åæé 彿°ç¾åã
ç»§æ¿æ¥å£
åç±»ä¸æ ·ï¼æ¥å£ä¹å¯ä»¥ç¸äºç»§æ¿ã è¿è®©æä»¬è½å¤ä»ä¸ä¸ªæ¥å£éå¤å¶æåå°å¦ä¸ä¸ªæ¥å£éï¼å¯ä»¥æ´çµæ´»å°å°æ¥å£åå²å°å¯éç¨ç模åéã
interface Shape {
color: string;
}
interface Square extends Shape {
sideLength: number;
}
let square = <Square>{};
square.color = "blue";
square.sideLength = 10;
ä¸ä¸ªæ¥å£å¯ä»¥ç»§æ¿å¤ä¸ªæ¥å£ï¼å建åºå¤ä¸ªæ¥å£çåææ¥å£ã
interface Shape {
color: string;
}
interface PenStroke {
penWidth: number;
}
interface Square extends Shape, PenStroke {
sideLength: number;
}
let square = <Square>{};
square.color = "blue";
square.sideLength = 10;
square.penWidth = 5.0;
æ··åç±»å
å åæä»¬æè¿ï¼æ¥å£è½å¤æè¿°JavaScripté丰å¯çç±»åã å 为JavaScriptå ¶å¨æçµæ´»çç¹ç¹ï¼ææ¶ä½ ä¼å¸æä¸ä¸ªå¯¹è±¡å¯ä»¥åæ¶å ·æä¸é¢æå°çå¤ç§ç±»åã
ä¸ä¸ªä¾åå°±æ¯ï¼ä¸ä¸ªå¯¹è±¡å¯ä»¥åæ¶åä¸ºå½æ°å对象使ç¨ï¼å¹¶å¸¦æé¢å¤ç屿§ã
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
function getCounter(): Counter {
let counter = <Counter>function (start: number) { };
counter.interval = 123;
counter.reset = function () { };
return counter;
}
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
å¨ä½¿ç¨JavaScriptç¬¬ä¸æ¹åºçæ¶åï¼ä½ å¯è½éè¦åä¸é¢é£æ ·å»å®æ´å°å®ä¹ç±»åã
æ¥å£ç»§æ¿ç±»
彿¥å£ç»§æ¿äºä¸ä¸ªç±»ç±»åæ¶ï¼å®ä¼ç»§æ¿ç±»çæåä½ä¸å æ¬å ¶å®ç°ã 就好忥å£å£°æäºææç±»ä¸åå¨çæåï¼ä½å¹¶æ²¡ææä¾å ·ä½å®ç°ä¸æ ·ã æ¥å£åæ ·ä¼ç»§æ¿å°ç±»çprivateåprotectedæåã è¿æå³çå½ä½ å建äºä¸ä¸ªæ¥å£ç»§æ¿äºä¸ä¸ªæ¥æç§ææåä¿æ¤çæåçç±»æ¶ï¼è¿ä¸ªæ¥å£ç±»ååªè½è¢«è¿ä¸ªç±»æå ¶åç±»æå®ç°ï¼implementï¼ã
å½ä½ æä¸ä¸ªåºå¤§çç»§æ¿ç»ææ¶è¿å¾æç¨ï¼ä½è¦æåºçæ¯ä½ ç代ç åªå¨åç±»æ¥æç¹å®å±æ§æ¶èµ·ä½ç¨ã è¿ä¸ªåç±»é¤äºç»§æ¿è³åºç±»å¤ä¸åºç±»æ²¡æä»»ä½å ³ç³»ã ä¾ï¼
class Control {
private state: any;
}
interface SelectableControl extends Control {
select(): void;
}
class Button extends Control implements SelectableControl {
select() { }
}
class TextBox extends Control {
}
// Error: Property 'state' is missing in type 'Image'.
class Image implements SelectableControl {
select() { }
}
class Location {
}
å¨ä¸é¢çä¾åéï¼SelectableControlå
å«äºControlçæææåï¼å
æ¬ç§ææåstateã
å 为stateæ¯ç§ææåï¼æä»¥åªè½å¤æ¯Controlçå类们æè½å®ç°SelectableControlæ¥å£ã
å ä¸ºåªæControlçåç±»æè½å¤æ¥æä¸ä¸ªå£°æäºControlçç§ææåstateï¼è¿å¯¹ç§ææåçå
¼å®¹æ§æ¯å¿
éçã
å¨Controlç±»å
é¨ï¼æ¯å
许éè¿SelectableControlçå®ä¾æ¥è®¿é®ç§ææåstateçã
å®é
ä¸ï¼SelectableControlå°±åControl䏿 ·ï¼å¹¶æ¥æä¸ä¸ªselectæ¹æ³ã
ButtonåTextBoxç±»æ¯SelectableControlçåç±»ï¼å 为å®ä»¬é½ç»§æ¿èªControlå¹¶æselectæ¹æ³ï¼ï¼ä½ImageåLocationç±»å¹¶ä¸æ¯è¿æ ·çã