1.基礎(chǔ)類型:
- boolean
- number
- string
- 數(shù)組:number[ ]/數(shù)據(jù)泛型方式 Array<number>
- 元組tuple:數(shù)組的一種,用來表示一個已知元素數(shù)量和類型的數(shù)組;
let arr:[number , string] = [10 , 'test' ]
- 枚舉enum:從0開始為元素編號。也可以手動的指定成員的數(shù)值,數(shù)值會遞增??梢杂擅杜e的值得到它的名字,也可以由名字得到相應(yīng)的值
enum Color {
Red,
Blue,
}
let b: string;
let a: number;
a = Color.Red; // 0
b = Color[0]; // 'Red'
- any
- void:表示沒有任何類型
- null / undefined:默認(rèn)情況下是所有類型的子類型,當(dāng)指定了--strictNullChecks標(biāo)記,null和undefined只能賦值給void和它們各自
- never:永不存在的值的類型
- object:非原始類型,即除
number
,string
,boolean
,symbo
l,nul
l或undefined
之外的類型
2.接口類型interface
可以用來描述一個對象或者函數(shù)
interface Config {
width: number;
color?: string; // 可選屬性
readonly id: string; // 只讀屬性
childs: ReadonlyArray<number>; // ts具有ReadonlyArray<T>類型,與Array<T>相似,只是把所有可變方法去掉了
[propName: string]: any; // 任意屬性,任意數(shù)量的其它屬性
}
interface Fun {
(name:string, age:number): void
}
接口繼承(擴展):extends
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;
4.函數(shù)類型
函數(shù)類型包含兩部分:參數(shù)類型和返回值類型。 當(dāng)寫出完整函數(shù)類型的時候,這兩部分都是需要的。
// 將輸入輸出類型分別指定,為函數(shù)定義類型
let myAdd = function(x: number, y: number): number { return x + y; };
// 將函數(shù)整體定義指向函數(shù)變量,即書寫完整函數(shù)類型
let myAdd: (baseValue: number, increment: number) => number = function(x, y) { return x + y; };
// 將函數(shù)以接口形式定義指向給函數(shù)變量,函數(shù)接口類型
let myAdd: {(baseValue: number, increment: number):number} = function(x, y) { return x + y; };
只要參數(shù)類型是匹配的,那么就認(rèn)為它是有效的函數(shù)類型,而不在乎參數(shù)名是否正確
5.泛型:
泛型就是指在定義函數(shù)、接口或者類的時候不預(yù)先指定具體的類型,而在使用的時候在指定類型的一種特性
泛型在函數(shù)中的應(yīng)用:
// 將輸入輸出類型分別指定
function test1<T>(arg:T[ ]):T[ ]{ return arg; }
const test2 = <P>(arg:P):P=> arg;
// 定義函數(shù)整體類型的方式
const test3:<U>(val:U)=>U = val => val;
// 接口定義函數(shù)的形式
const test4: { <T>(val:T): T} = val => val;
在接口中的應(yīng)用:
interface Props<T> {
dataSource: T[];
}
在類型別名中的應(yīng)用:
type Props<T> = {
dataSource: T[];
}
6.高級類型
- 聯(lián)合類型:type C = A | B; C滿足A或者滿足B(聯(lián)合類型表示一個值可以是幾種類型之一,對象聯(lián)合類型只能訪問聯(lián)合中所有共同成員)
- 交叉類型:type C = A & B; C即滿足A又滿足B(交叉類型是將多個類型合并為一個類型,對象交叉類型能訪問聯(lián)合中所有成員)
- 類型別名type:和接口很像,也可以用來描述對象或者函數(shù),但是可以作用于原始值,聯(lián)合類型,元組以及其它任何你需要手寫的類型
type Name = string;
type Config<T> = {
width: number;
color?: string; // 可選屬性
other?: T; // 可以是泛型
}
type Fun = (name:string, age:number): void
類型別名不能被 extends
和 implements
(自己也不能 extends
和 implements
其它類型)
無法通過接口來描述一個類型并且需要使用聯(lián)合類型或元組類型,這時通常會使用類型別名。
- 索引類型 keyof / T[K]
function pluck<T, K extends keyof T>(o: T, names: K[]): T[K][] {
return names.map(n => o[n]);
}
interface Person {
name: string;
age: number;
}
let person: Person = {
name: 'Jarid',
age: 35
};
let strings: string[] = pluck(person, ['name']); // ok, string[]---> ['Jarid']
keyof T 索引類型查詢操作符,其的結(jié)果為 T上已知的公共屬性名的聯(lián)合
T[K] 索引類型訪問操作符
- 映射類型 in
type Keys = 'option1' | 'option2';
type Flags = { [K in Keys]: boolean };
// Partial是ts內(nèi)置的工具類型,源碼如下:
type Partial<T> = { [P in keyof T]?: T[P] }
// 作用:生成一個新類型,該類型與 T 擁有相同的屬性,但是所有屬性皆為可選項
interface Foo {
name: string
age: number
}
type Bar = Partial<Foo>
ts庫里還有其他的一些工具類型,如Readonly / Pick / Record / Exclude/ Extract...
- 類型斷言:<類型>值 / 值 as 類型()
模塊
TypeScript與ECMAScript 2015一樣,任何包含頂級import或者export的文件都被當(dāng)成一個模塊。相反地,如果一個文件不帶有頂級的import或者export聲明,那么它的內(nèi)容被視為全局可見的(因此對模塊也是可見的)