Type Script(七):汎用

2616 ワード

1汎用ベース
汎用型とは、関数やインタフェースを定義する際に、タイプを指定せずに使用する場合にのみ、タイプを指定する特徴で、プレースホルダに相当します.
  • 例1、簡単な例
  • //            
    function echo(arg: T): T {
      return arg
    }
    
    const result1: boolean = echo(true)
    
    const result2: number = echo(111)
    
  • 例2、2つのパラメータ交換位置
  • function swap(tuple: [T, U]): [U, T] {
      return [tuple[1], tuple[0]]
    }
    const result3 = swap(['string', 123])
    
    

    2汎用拘束
    関数が汎用を使用する場合、パラメータにlengthプロパティを持たせるには、汎用制限を直接使用する場合、次の例でエラーが発生します.
    function echoWithArr1(arg: T): T {
      console.log(arg.length) // Property 'length' does not exist on type 'T'
      return arg
    }
    
    

    この場合、パラメータをコンストレイントするか、限定する必要があります.ソリューション1では、パラメータはオブジェクトを使用します.オブジェクトにlengthプロパティがあるため、次のようになります.
    function echoWithArr(arg: T[]): T[] {
      console.log(arg.length)
      return arg
    }
    const arrs = echoWithArr([1, 2, 3])
    
    

    この方法はあまりよくありません.stringに伝えたい場合、またはオブジェクトが間違っているからです.
    ソリューション2、 を使用:キーワードextends
    interface IWithLength {
      length: number
    }
    
    function echoWithLength(arg: T): T {
      console.log(arg.length)
      return arg
    }
    
    const str = echoWithLength('str')
    const obj = echoWithLength({ length: 10, width: 10})
    const arr2 = echoWithLength([1, 2, 3])
    

    3汎用、クラス、インタフェース
  • クラス汎用
  • を使用
    class Queue {
      private data = [];
      push(item: T) {
        return this.data.push(item)
      }
      pop(): T {
        return this.data.shift()
      }
    }
    
    const queue = new Queue()
    queue.push(1) //     ,       
    console.log(queue.pop().toFixed())
    
    
    const queue2 = new Queue()
    queue2.push('str') //      ,        
    console.log(queue2.pop().length)
    
  • インタフェースは汎用
  • を使用する.
    interface KeyPair {
      key: T;
      value: U;
    }
    let kp1: KeyPair = { key: 123, value: "str" }
    let kp2: KeyPair = { key: 'test', value: 123 }
    
  • オブジェクト使用インタフェース汎用
  • let arr: number[] = [1, 2, 3]
    
       
    
    let arrTwo: Array = [1, 2, 3] // Array    ,       
    
  • インタフェースは、関数のタイプ
  • を記述する.
    interface IPlus {
      (a: T, b: T) : T
    }
    
    function plus(a: number, b: number): number {
      return a + b;
    }
    const a: IPlus = plus //       a   ,     plus     
    
    
    
    function connect(a: string, b: string): string {
      return a + b
    }
    const b: IPlus = connect //       b   ,     connect