年前由于需要了解 Egret 學習了一下 TypeScript,現在做一下學習筆記。以免不知道學了些什么。
主要學習資料就是官方文檔
5 分鐘入門
TS 是 JS 的超集,所以完全可以按所了解的 JS 語法來寫 TS 程序。所以遇到不太熟悉的地方就按 JS 的寫法來寫即可。
TS 代碼最終會被翻譯成 JS 代碼。因此最終的 JS 代碼會丟失不少 TS 代碼中的類型信息。
TS 中可以在變量后面加類型聲明,基本語法如下:
varName :<typename>
類型名稱一般是小寫如string
,number
主要是為了避免與 JS 中的原生類型沖突。TS 中的實現接口的判定是按結構而不是按名稱的。也就是如果其實現符合某一個接口,也就意味著實現了某接口。即如下代碼中,
banxi
這一對象即可認為是實現了Person
接口。
interface Person{
name:string;
age:number;
}
let banxi = {name:"banxi", age:18};
- TS 支持更直接的類聲明。
class Student{
fullName:string
constructor(public firstName:string,public lastName:string,middleInitial:string){
this.fullName = firstName + " " + middleInitial + " " + lastName;
}
}
上面的聲明將翻譯成如下 JS 代碼:
var Student = /** @class */ (function () {
function Student(firstName, lastName, middleInitial) {
this.firstName = firstName;
this.lastName = lastName;
this.fullName = firstName + " " + middleInitial + " " + lastName;
}
return Student;
}())
從上面的翻譯結果也可以看出,對于構造函數中帶有訪問修飾符public
的參數會被當作類的屬性處理。
快速入門手冊
基本類型
-
boolean
類型let isDone :boolean = true;
-
number
類型let binary:number = 0b1010;let hex:number = 0xff1e;
- String 類型,類似 JS,也支持
Hello,${expr}
這樣的插值表達式,并且支持多行字符串。 - Array 類型,
let list :number[] = [1,2,3];
或let list:Array<number> = [1,2,3];
- Tuple 類型,
let entry: [string,number] = ["banxi", 18];
,可以通過entry[0]
,entry[1]
來訪問。如果索引大于1
那么對應的數據類型其實是string|number
即一個聯合類型。 - Enum 類型,
enum Color{Red,Green,Blue};
對應翻譯的 JS 代碼如下:
var Color;
(function (Color) {
Color[Color["Red"] = 0] = "Red";
Color[Color["Green"] = 1] = "Green";
Color[Color["Blue"] = 2] = "Blue";
})(Color || (Color = {}))
Any 類型,
let anyObj:any;
使用any
類型來放松類型檢查。如果使用Object
則存在只能調用Object
類的方法的限制。void
類型, 一般用在函數返回類型中表示此函數沒有返回值。undefined
類型與null
類型。在沒有啟用嚴格檢查時它們可以當作是其他類型的子類型,但是啟用了--strictNullChecks
選項之后。則只能賦值給void
及它們自己的類型。或者對應參數是類似string | null | undefined
這樣的聯合的類型。never
類型,一般用在函數返回值類型中表示此函數永遠不會執行到return
語句。
關于類型轉換的說明。
- 有 angle-bracket 語法的轉換方式如:
let someValue:Any = "a string"; let len:number = (<string>someValue).length;
- 或者通過
as
操作符,let len:number = (someValue as string).length;
值得注意的是,當啟用了 JSX
支持時,上面的第一種方式不可用。