typescript学习记录
2021.01.18
le31ei
Program
 热度
℃
1 安装 全局安装:npm install -g
2 helloworld 创建文件test.ts
1 2 3 4 const hello = (name: string ) => { return `hello ${name} ` } hello("testme" )
运行命令行tsc test.ts
生成test.js
1 2 3 4 5 var hello = function (name ) { return "hello " + name; }; hello("testme" );
string类型的限定并不会在js中产生新的代码,但是在tsc进行编译的时候,会有类型检查
将调用函数改为hello(123)
会报如下错误:
1 2 3 4 5 6 7 test.ts:7 :7 - error TS2345: Argument of type 'number' is not assignable to parameter of type 'string' . 7 hello(123 ) ~~~ Found 1 error.
但是test.js
文件仍然生成了。
1 2 3 4 5 var hello = function (name ) { return "hello " + name; }; hello(123 );
3 数据类型 1 2 3 4 5 6 7 8 9 let isDone: boolean = false ;isDone = true ; let age: number = 10 ;let firstname: string = 'testme' ;let message: string = `hello, ${firstname} ` ;let u: undefined = undefined ;let n: null = null ;let num: number = undefined ;
null和undefined的区别
变量在还未初始化时,变量的默认值为undefined
null表示尚未存在的对象,常用来表示函数返回一个不存在的对象。
undefined是在null的基础上派生出来的,所以会判定为相等
1 2 3 console .assert(null == undefined ) console .assert(null === undefined ) console .assert(typeof null == typeof undefined )
any类型
可以赋值为任意类型,可以调用任意方法及属性
1 2 3 4 5 let notSure: any = 4 ;notSure = '123' ; notSure = true ; notSure.myName; notSure.getName();
const、let、var的区别
const定义的变量不可以修改,而且必须进行初始化
var定义的变量可以进行修改,不初始化会默认定义为undefined,不会报错
let是块作用域,在函数内部使用let定义变量后,对函数外部无影响。
建议使用的优先级const > let > var
4 数组和元组 数组,存放的数据为同一类型
1 2 3 4 let arrofNumbers: number [] = [1 ,2 ,3 ];arrofNumbers.length; arrofNumbers.push(3 ); console .log(arrofNumbers.length);
元组,存放的数据可以为不同类型
1 2 let user: [string , number ,] = ['1234' , 123 ]user.push('123' )
5 interface接口 定义:对对象的形状进行描述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 interface IPerson{ readonly id: number ; name: string ; age?: number ; } let viking: IPerson = { id: 1 , name: 'viking' , age: 20 } viking.id = 123 ;
6 函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function add (x: number , y: number ): number { return x + y; } const add2 = (x: number , y : number , z?:number ): number => { if (typeof z === 'number' ){ return x+y+z; } return x + y; } interface ISum{ (x: number , y : number , z?:number ): number } let add3: ISum = add
7 类型推论、联合类型、类型断言 根据赋值的类型推断出变量的类型:
联合类型
1 2 3 4 5 let numberOrString: number | string ;numberOrString.length numberOrString.toString numberOrString = 123 ; numberOrString = '123' ;
类型断言:在函数中断言该变量类型是什么类型,然后调用对应的方法
1 2 3 4 5 6 7 8 9 function getLength (input: string | number ): number { const str = input as string ; if (str.length){ return str.length }else { const num = input as number return num.toString().length } }
另一种写法:
1 2 3 4 5 6 7 function getLength2 (input: string | number ): number { if (typeof input === 'string' ){ return input.length }else { return input.toString().length } }
8 类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Animal { name: string ; constructor (name ) { this .name = name } run ( ) { return `${this .name} is running` ; } } const snack = new Animal('test' );class Dog extends Animal { bark ( ) { return `${this .name} is barking` ; } } const xiaobao = new Dog('xiaobao' )
类实现接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 interface IRadio { switchRadio(trigger: boolean ): void ; } interface IBattary{ checkBattaryStatus(): void } interface IRadioWithBattery extends IRadio{ checkBattaryStatus(): void } class Car implements IRadio { switchRadio (trigger: boolean ) { } } class CellPhone implements IRadioWithBattery { switchRadio (trigger: boolean ) { } checkBattaryStatus ( ) { } }
9 枚举 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 enum Direction{ Up = 10 , Down, Left, Rigth, } console .log(Direction.Left)console .log(Direction[0 ])const enum Direction{ Up = "Up" , Down = "Down" , Left = "Left" , Rigth = "Right" , }
10 泛型 根据我们传入的一个类型,返回一个类型
1 2 3 4 5 6 7 8 9 10 11 12 13 function echo <T >(arg: T ): T { return arg; } function echo2 (arg ) { return arg; } const str: string = "123" ;const result = echo(str);const result2 = echo2(str);
1 2 3 4 5 function swap <T , U >(tuple: [T, U] ): [U , T ] { return [tuple[1 ], tuple[0 ]]; } const res = swap(['string' , 123 ])
约束泛型
提前在代码中使用对应类型的方法及属性。
通过接口定义来约束泛型
1 2 3 4 5 6 7 8 interface IWithLength{ length: number } function echoWithArr2 <T extends IWithLength >(arg: T[] ): T [] { console .log(arg.length) return arg }
泛型类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Queue <T > { private data = []; push (item:T ) { return this .data.push(item) } pop():T{ return this .data.shift() } } const queue = new Queue<number >();queue.push(1 ); queue.push(2 ) console .log(queue.pop().toFixed())console .log(queue.pop().toFixed())
泛型接口
1 2 3 4 5 6 7 8 interface KeyPair<T, U>{ key: T, value: U } let kp1: KeyPair<number , string > = {key : 1 , value : 'str' }let kp2: KeyPair<string , number > = {key : '1' , value : 123 }let arr2: Array <number > = [1 ,2 ,3 ]
11 交叉类型 1 2 3 4 5 6 7 interface IName{ name:string } type IPerson = IName & { age : number } let person: IPerson = {name : 'test' , age : 123 }