boolean
let isDone: boolean = false;
let createdByNewBoolean: boolean = new Boolean(1);
// index.ts(1,5): error TS2322: Type 'Boolean' is not assignable to type 'boolean'.
但是如果使用以下兩個方法都可以
let createdByNewBoolean: Boolean = new Boolean(1);
let createdByBoolean: boolean = Boolean(1);
其他 javascript 的基本類型都是如此
number
let decLiteral: number = 6;
let notANumber: number = NaN;
let infinityNumber: number = Infinity;
string
單雙引號和 Backtick 都可以
let myName: string = "Tom";
let myName: string = "Tom";
let sentence: string = `Hello! I'm ${myName}.`;
array
TypeScript 對於陣列提供兩種寫法:
- 傳統 JavaScript 風格寫法
- 泛型風格寫法
let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3];
tuple
陣列必須每個元素的型別都相同,若你希望陣列中有不同型別的元素,則應該使用 tuple
let x: [string, number];
x = ["hello", 10];
x = [10, "hello"]; // 編譯失敗
void
如果 function 明確不傳回任何值,可以使用 void
function alertName(): void {
alert("My name is Tom");
}
null 與 undefined
let u: undefined = undefined;
let n: null = null;
或是這樣也可以
let num: number = undefined;
let u: undefined;
let num: number = u;
any
如果是普通類型,在賦值的時候改變型態是不行的,如
let myFavoriteNumber: string = "seven";
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
但是如果是 any 就可以
let myFavoriteNumber: any = "seven";
myFavoriteNumber = 7;
在任意值上讀取任何屬性都是可以的
let anyThing: any = "hello";
console.log(anyThing.myName);
console.log(anyThing.myName.firstName);
也可以調用任何方法
let anyThing: any = "Tom";
anyThing.setName("Jerry");
anyThing.setName("Jerry").sayHello();
anyThing.myName.setFirstName("Cat");
如果是未聲明類型的變數,那將會被視為 any 型態
let something;
something = "seven";
something = 7;
something.setName("Tom");
等價於
let something: any;
something = "seven";
something = 7;
something.setName("Tom");
- 但是實務上不建議使用 any 型別,因為這將喪失 TypeScript 的型別檢查機制,除非有充分的理由
聯合類型
類型可以是多種類型的一種,如
let myFavoriteNumber: string | number;
myFavoriteNumber = "seven";
myFavoriteNumber = 7;
let myFavoriteNumber: string | number;
myFavoriteNumber = true;
// index.ts(2,1): error TS2322: Type 'boolean' is not assignable to type 'string | number'.
// Type 'boolean' is not assignable to type 'number'.
裡面的屬性或方法一定是要每個類型都有的
function getLength(something: string | number): number {
return something.length;
}
// index.ts(2,22): error TS2339: Property 'length' does not exist on type 'string | number'.
// Property 'length' does not exist on type 'number'.
上例中,length 不是 string 和 number 的共有屬性,所以會噴錯
Type Assertion 類型斷言
實務上有時宣告了 any,但為了 intellisense 或其他變數,需要做明確的轉型,此時可使用 type assertion 明確轉型,也就是告訴編譯器:「我自己知道此變數的明確型別,請相信我的轉型」
-
類型斷言有兩種形式
- <>
let someValue: any = "this is a string"; let strLength: number = (<string>someValue).length;
- as
- 當你在 TypeScript 裡使用 JSX 時,只有 as 語法斷言是被允許的
let someValue: any = "this is a string"; let strLength: number = (someValue as string).length;
初始化物件
TypeScript 有 3 種寫法,可以寫出類似 C# Object Initializer 風格的程式碼
const hero: Hero = {
name: "Sam",
state: "active"
};
const hero = <Hero>{
name: 'Sam',
state: 'active'
};
const hero = {
name: 'Sam',
state: 'active'
} as Hero;
宣告函數
function addMe(num1: number, num2: number): number {
return num1 + num2;
}
var addMe = function(num1: number, num2: number): number {
return num1 + num2;
};