TypeScript 노트 요약

typescript 요약 노트
서문 소개
  • typescript의 장점은 정적 약한 유형 언어로 컴파일할 때 오류를 보고하고 버그를 낮출 수 있다. 저급 오류가 발생할 가능성은 코드 알림을 가지고 유형 주석은 여러 사람이 합작하는 프로젝트에 대해 비교적 우호적이고 의사소통 원가를 낮춘다
  • 왜 ts를 학습하는지는 상기 몇 가지 장점을 제외하고 ts는 우리가 데이터 유형 사고(데이터 정의: 데이터 유형 & 구조)를 단련하고 인코딩의 엄밀성과 코드의 건장성을 향상시키는 데 도움을 줄 수 있다.이 필기는 ts의 이론적 기초와 실천 두 방면에 대해 정리를 했다
  • 일부 생각은ts프로젝트를 쓸 때 흔히 우리가 밖으로 출력하는 변수 유형을 제한하지만 외부에서 프로젝트에 입력한 데이터 구조와 유형은 우리가 제한할 수 없다. 예를 들어 인터페이스에서 되돌아오는 데이터도 제한할 수 있지만 약간 까다롭다. 또한 일반적인 사용은 매우 유연하다.멀티 쓰기 기능 통합
  • 이론 기초편
    일반 유형
    기초편은 빠르게 넘어가서...
  • string
  •   let s: string = 'i am string'
  • number
  •   let n: number = 1
  • boolean
  •   let b: boolean = true
  • null & undefined
  •   // undefined             undefined
      // null             null
      //           
      let ud: undefined = undefined
      let nu: null = null
  • void 공백
  •   //          void
      //      void            undefined   null
      const popup = (): void => {
        console.log('function no return')
      }
      let useless: void = undefined
  • any 임의의 타입, 정말 방법이 없으면 이걸로 해요
  •   //         ,              any
      let anyType: any = 'str'
  • unkonwn
  •   let uk: unknown;
      // unknown   any        unknown        :
        unknown             ,             ,      as  
          any           ,          。
      //   unknown             ,               
  • 수조array
  •   let arr1: (number | string)[] = [1, 2, 3, '2121']
      let arr2: Array = [2, 2, 2, true]
  • 원조
  •   //                 ,          ;      
      //                    
      let t1: [string, number, boolean | string]
      t1 = ['hello', 123, false]
  • never
  •   //          
      // never  :                                   
      //         never        ,         
      const err = (msg: string): never => {
        throw new Error(msg)
      }
      // err('hahaahah')
  • symbol
  •   let ss: symbol = Symbol('hello')
      console.log(ss)
  • object는 데이터 형식이object
  • 임을 나타낸다
      let obj: {name: string, value: number} = { name: 'huhua', value: 1232 }
      let obj1: object = { name: '  ', value: 1232 }
      console.log(obj, obj1, obj.name)
      // console.log(obj1.name) // name    object  
  • function구체후세강
  •   let myAdd = (x: number, y: number): number => x + y
      let add = (x: number, y: number) => x + y //     ,          
      console.log(myAdd(1, 2), add(3, 100))
    
      let compute: (x:number, y:number) => number   //       
      compute = (aaa, bbb) => aaa + bbb

    열거 유형enum
    매거: 우리는 상량의 집합으로 이해할 수 있고 하드코딩 문제, 특히if문장의 판단값을 해결하는 데 도움을 줄 수 있다.
  • 숫자 열거
  • export enum EState {
      one = 1,
      two,
      three,
      four,
      five,
      six,
      seven
    }
          : EState['one'] === 1; EState[1] === 'one'
              ;                
  • 문자열 열거
  • enum Direction {
      Up = 'Up',
      Down = 'Down',
      Left = 'Left',
      Right = 'Right'
    }
    
    console.log(Direction['Right'], Direction.Up); // Right Up
  • 이기종 열거(혼합)
  • enum StrNum {
      n = 0,
      y = 'yes'
    }
  • 상수 매거(const 성명)
  • //                 ,     
    const enum Direction {
      Up = 'Up',
      Down = 'Down',
      Left = 'Left',
      Right = 'Right'
    }
    
    const up = Direction.Up
    console.log(up)

    인터페이스 인터페이스
    인터페이스(Interfaces)는 대상의 형상(Shape)을 설명하는 데 사용됩니다. 인터페이스는 일반적으로 우리가 정의한 대상, 함수, 클래스의 구조와 유형을 제약하는 데 사용됩니다.
  • 대상 제약
  • //      ,                 (       ,       )
    interface Person {
      readonly id: number //     
      name: string
      age: number
      sex?: string //     
      [key: string]: any //      ,       ;       any    
    }
  • 함수 제약
  •          ,            
    interface Func {
      (x: number, y: number): number
    }
    let addSum1: Func
    addSum1 = (a, b) => a + b
  • 류 제약
  • //              ,         ,      (implements)
    //                ;            
    //              public
    //             
    interface Man {
        name: string
        age: number
    }
    
    class Huhua implements Man {
        //         
        name!: string //     
        age!: number
        constructor(name: string, age: number) {
            this.name = name
            this.age = age
        }
        eat() {
            console.log('eat food')
        }
    }
  • 인터페이스 상속
  • //       
    interface Alarm {
        alert();
    }
    interface LightableAlarm extends Alarm {
        lightOn();
        lightOff();
    }
    //      
    class Point {
        x: number;
        y: number;
    }
    interface Point3d extends Point {
        z: number;
    }
    
    let point3d: Point3d = {x: 1, y: 2, z: 3};

    함수 유형
  • 함수 유형 정의:
  • // function   
    function add(a:number, b: number) {
      return a + b
    }
    //       ,        
    let add: (a: number, b: number) => number
    type Add: (a: number, b: number) => number
    interface IAdd {
      (a: number, b: number): number
    }
  • 매개변수
  • //     ,     ,     :     
    function add(a: number, b = 100, c?: number) {
      return c ? a + b + c : a + b
    }
    function add(x: number, ...rest: number[]) {
      return x + rest.reduce((pre, acc) => pre + acc)
    }
  • 함수 재부팅
  •          ,               ,     
    function add(...rest: number[]): number
    function add(...rest: string[]): string
    function add(...rest: any[]): any {
      let first = rest[0]
      if (typeof first === 'string') {
        return rest.join('')
      }
      if (typeof first === 'number') {
        return rest.reduce((pre, acc) => pre + acc)
      }
    }

    클래스 유형class
    ts는 주로 구성원의 유형 주석과 구성원 수식자를 추가한다.ES6에서 클래스의 데이터 유형은 바로 함수이다. 클래스 자체가 구조 함수를 가리키는데 그 방법은 모두 구조 함수의protype 속성에 정의된다.우리는 ClassName을 통과할 수 있습니다.prototype.xxx 방문
  • 클래스 선언
  • class Car {
      //     :          
      _wheel: number = 4
      //          :         ( this)
      constructor(name: string) {
        this.name = name
      }
      //     
      readonly oil: string = '  '
      // public    :           
      public name: string = 'car'
      //     
      run() { console.log(this.name + 'runing...') }
      //     :              
      private priv() { console.log('priv') }
      //      :                    
      protected pro() {}
      //     :               
      static seats: string = '  '
    }
    let bz = new Car('benz') //    new     
    let bm: Car = new Car('bm') //     
    console.log(Car.seats)
  • 류 계승
  • class Bmw extends Car {
      constructor(name: stirng, public color: string) {
        //         
        super(name)
        this.color = color
      }
    }
    console.log(Bmw.seats)
  • 추상류 abstract
  • 추상 클래스는 실례화할 수 없다. 일반적으로 기본 클래스로 사용되기 때문에 우리는 다른 클래스의 공공 속성과 방법을 추출하여 추상 클래스에 쓸 수 있다.
    abstract class Animal {
      // abstract                         
      abstract say(): void;
      move(): void {
        console.log('i can move')
      }
    }
    
    class Dog extends Animal {
      //          ,                ;        
      say() {
        console.log('   ');
      }
    }
    
    let dog1 = new Dog()
    dog1.say() //    
    dog1.move() // i can move
  • 클래스 구현 인터페이스
  •                ,              (interfaces),  implements       
    //                (         );            
    //              public
    //             
    interface Alarm {
        alert();
    }
    
    interface Light {
        lightOn();
        lightOff();
    }
    
    class Car implements Alarm, Light {
        alert() {
            console.log('Car alert');
        }
        lightOn() {
            console.log('Car light on');
        }
        lightOff() {
            console.log('Car light off');
        }
    }

    범형(유형에 대한 전삼에 해당)
    범형: 함수, 인터페이스, 클래스를 정의할 때 구체적인 유형을 미리 지정하지 않고 사용할 때 유형의 특성을 다시 지정합니다.선언과 동시에 유형 변수의 유형 값을 지정합니다.
    // 1.    
    //   T           any  
    //                     any     
    function log(v: T): T {
      return v;
    }
    let s: string = "generics";
    let a = log(s);
    console.log(a);
    console.log(log(1111));
    
    // 2.      
    //     ,                  type     。
    // type Log = (v: T) => T //     
    interface Log {
      (v: T): T;
    }
    let myLog: Log = log;
    console.log(myLog([1, 2, 3]));
    
    // 3.    
    //                    
    //         
    interface IGeneric {
      (v: T): T;
    }
    let IG1: IGeneric = log;
    console.log(IG1(123));
    
    // 4.   
    class GenericNumber {
      //               
      // zeroValue: T = T;
      add(x: T, y?: T) {
        console.log(x);
        return x;
      }
    }
    
    let myGenericNumber = new GenericNumber();
    myGenericNumber.add(1);
    let myG1 = new GenericNumber();
    myG1.add("hello ts generics");
    
    // 5.    
    interface Length {
      length: number;
    }
    
    // T  Length  ,              length     value.length      
    function ggg(value: T): T {
      console.log(value, value.length);
      return value;
    }
    ggg('hello')
    ggg([1, 2, 3])

    이론 진급편
    ts 유형 검사 메커니즘
  • 유형 추정
  • tsconfig에 따라.json의 설정 규칙을 추정하고 상하문 추정, 유형 단언 as, 이중 단언, is 키워드: xx isstring, 할당 단언let x!:string
  • 유형 호환
  • 서로 다른 변수가 서로 값을 부여할 때의 유형 검사 함수 호환성: 매개 변수 개수, 매개 변수 유형, 반환값 유형 인터페이스 호환성: 구성원이 적으면 구성원이 많을 수 있는
  • 유형 보호
  • 특수 블록에서 확정된 유형 속성과 방법, 예를 들어 결합 유형 변수를 사용할 때
    1.instanceof
    if (c instanceof A) c.a 
    2.in
    if (c in C) c.a
    3.typeof
              
    if (typeof arg === 'string') {} else {}
    4.        
       

    결합, 교차, 색인 유형
  • 교차 & 합병 유형 속성
  • 공동 | 지정 유형의 모든 가능성
  • 인덱스
  • //          ;
    //          K keyof T:        ;
    //           T[K]; 
    //      T extends U
    interface IObj {
      a: string
      b: number
    }
    let key: keyof IObj
    let k: IObj['a']
    
    let iobj = {
      a: 1,
      b: 2,
      c: 'ccc'
    }
    //       
    function getObjValue(obj: T, keys: K[]): T[K][] {
      return keys.map(key => obj[key])
    }
    console.log(getObjValue(iobj, ['a', 'c']));
    // console.log(getObjValue(iobj, ['a', 'd']));   

    공정 실천 편
    이것은 우리가 정식 개발에서ts를 사용하는 기교와 규범에 대한 설명이다
    tsconfig.json
    //ts 프로젝트 프로필 설명https://segmentfault.com/a/11...http://www.typescriptlang.org...
    선언 파일 xxx.d.ts
    declare var       
    declare function       
    declare class      
    declare enum         
    declare namespace   (      )    
    declare interface   type       
    export     
    export namespace   (      )  
    export default ES6     
    export = commonjs     , import xx = require('xxx')
    export as namespace UMD        
    declare global       
    declare module     

    ts 도구 클래스 (일반)
  • Partial: 속성을 모두 선택 사항으로 변경합니다.
  • type Partial = { [P in keyof T]?: T[P] };
    type p = Partial
  • Required: 선택 사항을 필수로 변경
  • Exclude: T에서 U에 할당할 수 있는 요소 제외
  • type T = Exclude<1 | 2, 1 | 3> // -> 2
  • Omit: Omit의 역할은 T의 일부 속성을 무시하는 것입니다.
  • type Foo = Omit // -> { age: number }
  • Merge: Merge의 역할은 두 대상의 속성을 합치는 것이다:
  • Intersection의 역할은 T의 속성을 취하는 것이고 이 속성도 U.
  • 에 존재한다.
  • Overwrite U의 속성은 T의 동일한 속성을 덮어씁니다
  • .
    개발한 기교들
    업데이트 예정...
    질문
    본인은 vue 프로젝트에서 먼저 사용했는데 지원이 좋지 않은 것 같아서...하지만 이를 악물고 한 항목을 완성했고, 후속으로react에서 사용할 예정입니다.
  • 관련 플러그인 문서 vue-class-component:
    https://github.com/vuejs/vue-docs-zh-cn/tree/master/vue-class-component
    
    vue-property-decorator:
    https://github.com/kaorun343/vue-property-decorator
    
    vuex-class:
    https://github.com/ktsn/vuex-class
    
    vuex-module-decorators
    https://github.com/championswimmer/vuex-module-decorators
    
  • 유형 단언:ts컴파일러의 유형 검사를 빙빙 돌리는 데 사용한다.즉, 값의 유형을 수동으로 지정
  •       =>   value
            as    => value as string
        (this.$refs['multiTable'] as any).clearSelection()
        (this.$refs['downParams'] as Form).resetFields()
  • $refs 이중단언
  •     ((this.$refs.saveTagInput as Vue)['$refs'].input as HTMLInputElement).focus()
  • 삼자 라이브러리를 사용할 때 성명 파일을 설치하거나 직접 작성합니다 @types/xxx
  • 미완성, 추가 업데이트...

    좋은 웹페이지 즐겨찾기