TS-Learn
基本类型
let unsable:void = undefined
let u:undefined = undefined let n:null = null
let isRight:boolean = false
let str: string = 'hello' let combine:string = `${str} ,how are you`
let num: number = 12 let notNum:number = NaN
let arr: Array<number> = [1, 2, 3] let arr1: number[] = [4, 5, 6]
interface NumberArray { [index: number]: number } let fibonacci: NumberArray = [1, 1, 2, 3, 5]
let arr2: (number | string)[] = [4, 5, 6, 'asd']
let list: any[] = ['xcatliu', 25, { website: 'http://xcatliu.com' }]
let mix: number | string = 1
let func: (arr: number[]) => number[] = function (arr: number[]) { return arr }
interface objType { readonly a: number b?: number[] } let obj: objType = { a: 1, b: [1] }
type GameState = 'pause' | 'running' | 'end' let gameState: GameState = 'running'
|
Any
let num:any = 'five' num = 7
let anyT:any = '123' anyT.myName
anyT.setName('aya')
|
声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值
未声明类型的变量
- 变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型
类型推论
根据第一次赋值给定类型,如果多次不同类型赋值,就会被推断为any。
联合类型
let num:string | number num = 'seven' num = 7 num = true
|
let myFavoriteNumber: string | number myFavoriteNumber = 'seven' myFavoriteNumber.length myFavoriteNumber = 7 console.log(myFavoriteNumber.length)
|
接口
interface objType { readonly a: number b?: number[] [propName: number]: any } let obj: objType = { a: 1, b: [1] }
|
函数
let func: (arr: number[]) => number[] = function (arr: number[]) { return arr }
|
接口定义函数的形状
interface SearchFunc { (source: string, subString: string): boolean; }
let mySearch: SearchFunc; mySearch = function(source: string, subString: string) { return source.search(subString) !== -1; }
|
重载
function reverse(x: number): number; function reverse(x: string): string; function reverse(x: number | string): number | string | void { if (typeof x === 'number') { return Number(x.toString().split('').reverse().join('')); } else if (typeof x === 'string') { return x.split('').reverse().join(''); }
|
- 多次定义,TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面。
类型断言Type Assertion
用途
- 将一个联合类型断言为其中一个类型,尽量避免断言后调用方法或引用深层属性,以减少不必要的运行时错误。
- 将一个父类断言为更加具体的子类
Type Guard用typeof缩小范围
function getLen2(input: string | number):number{ if(typeof input === 'string'){ return input.length } else{ return input.toString().length } }
|
Enums枚举
enum Direction { Up, Down, Left, Right } console.log(Direction.Left) console.log(Direction[0])
|
编译后:实现双向赋值。
常量枚举
编译后:
外部枚举
declare enum Directions { Up, Down, Left, Right } let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
|
编译后:
var directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
|