TS:互換性のある推論のタイプ

TS:互換性のある推論のタイプ

1.互換性のある変数タイプ

  • 変数xがyと互換性がある場合、yは少なくともxと同じ属性を持っている必要があります。

    interface Named {
          
          
        name : string;
    }
    let x : Named;
    let y = {
          
          
        name : 'yivi',age : 12
    };
    x = y;	// ok,y中拥有x的属性name
    

2.互換性のある機能タイプ

  • 1つ目は、パラメーターの互換性です。関数xをyに割り当てることができるかどうかに応じて、xの各パラメーターはy内の対応するタイプのパラメーターを見つけることができなければなりません(パラメーター名は関係ありません。タイプは同じです)。

    let x = (a: number) => 0;
    let y = (b: number , s:string) => 0;
    y = x;	// ok
    x = y;	//error,x中缺少y的多余参数。
    
  • 2つ目は、戻り値の互換性です。元の関数の戻り値タイプは、ターゲット関数の戻り値タイプのサブタイプである必要があります。

    let x = () => ({
          
          name : 'yivi'});
    let y = () => ({
          
          name : 'yivi',age : 20});
    
    x = y;	// ok
    y = x; 	// error,x的返回值缺少参数。
    

3.オプションのパラメータと残りのパラメータの不安定性

  • 関数に残りのパラメーターがある場合、その関数は無制限の数のオプションのパラメーターとして扱われます。

  • これは型システムでは不安定ですが、操作の観点からは、ほとんどの関数のパススルーパスに相当しますundefined

  • コールバック関数のパラメーターはプログラマーには予測可能ですが、型システムには不確実です。

    function foo(args : any[],callback : (...args : any[]) => void){
          
          
        // 程序实现
    }
    

4.列挙型と互換性があります

  • 列挙型とデジタル型は相互に互換性があります。

  • 異なる列挙型は互いに互換性がありません。

    enum A {
          
          OKERROR};
    enum B {
          
          SUCCESS,FAILED};
    
    let status = A.OK;
    status = B.SUCCESS;	//error!
    

5.クラスの互換性

  • 2つのクラスタイプのオブジェクトを比較する場合、インスタンスのメンバーのみが比較されます。

  • 静的メンバーとコンストラクターは含まれていません!

    class Cat {
          
          
        kind : string;
        constructor(name : string,size : number){
          
          }
    }
    class Dog {
          
          
        kind : string;
        constructor(name : string){
          
          }
    }
    
    let c : Cat;
    let d : Dog;
    c = d;	//ok
    d = c;	//ok
    

6.一般的な互換性

  • typeパラメータの効果は、その結果タイプをタイプの一部として使用します。

    interface Empty<T> {
          
          }
    
    let x : Empty<number>;
    let y : Empty<string>;
    
    x = y;	//ok,由于接口里没有成员,所以y的结构和x一致
    
  • しかし、インターフェースにメンバーがいる場合、それは別の問題です。

    interface Full<T> {
          
          
        data : T
    }
    
    let x : Full<number>;
    let y : Full<string>;
    
    x = y;	// error!x和y的结构不一致!
    

おすすめ

転載: blog.csdn.net/yivisir/article/details/109586083