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}   
  |