Type-script-タイプ保護、タイプ互換


全体的には、インフラリーダーの板橋氏のタイプシナリオ入門講座を参考に整理した.
タイプスクリプトマニュアル / タイプスクリプトの開始
タイプバック
interface Developer {
  name: string;
  skill: string;
}

interface Person {
  name: string;
  age: number;
}

function introduce(): Developer | Person {
  return { name: 'Tony', age: 33, skill: 'Iron Making' };
}

var tony = introduce();

console.log(tony.skill); //접근이 불가
  • 基本的にUnionタイプを使うと、タイプの共通属性にしかアクセスできないので、開発者のスキルはアクセスできません.
  • 次の方法でアクセスします.
    if ((tony as Developer).skill) { //tony는 Developer이며 skill이 있을 경우
      var skill = (tony as Developer).skill;
      console.log(skill);
    } else if ((tony as Person).age) {//tony는 Person이며 age가 있을 경우
      var age = (tony as Person).age;
      console.log(age);
    }
    ASは
  • の便宜上使用されているが、可読性が悪いという欠点がある.
  • タイプバック
  • ビットを改善するための方法.
  • タイプの防御を使用する場合、関数の名前は「is対応タイプ」でよく使用されます.
  • /*
    1. 인자에 들어갈 target에 타입을 유니온 타입으로 정의
    2. return 값을 Boolean 값으로 구분하여 타입 가드로 접근
    3. 타입가드에서 다시 값을 Boolean값으로 반환
    4. 정의한 함수를 이용하여 타입 여부 확인 후 값 접근 가능
    */
    
    //타입가드 함수
    function isDeveloper(target: Developer | Person): target is Developer {
     eturn (target as Developer).skill !== undefined;
    }
    
    if (isDeveloper(tony)) { //Developer에 대한 값에 접근이 가능
     tony.skill; 
    } else {
     //Developer가 아닌 경우 유니온 타입으로 정의한 타입 중 Person에 대한 타입으로 접근이 가능
     tony.age; 
    }
    タイプ互換性
  • タイプのスクリプトコードでは、特定のタイプが他のタイプに適しているかどうかを意味します.
  • の右側のタイプがより多くのプロパティを持っているか、構造的に大きい場合は、左側と互換性があります.
  • interface Developer {
      name: string;
      skill: string;
    }
    interface Person {
      name: string;
    }
    
    var developer: Developer;
    var person: Person;
    
    developer = person; //error - 오른쪽의 타입이 더 적은 속성을 갖고 있음
    person = developer;
  • の内部に存在する属性とタイプの定義を比較します.
  • interface Developer {
      name: string;
      skill: string;
    }
    class Person {
      name: string;
    }
    
    person = developer; //타입 호환이 가능
    関数のタイプ互換性
    var add = function(a: number) {
      //...
    }
    var sum = function(a: number, b: number) {
      //...
    }
    
    // sum 함수가 add보다 크기가 더 큼
    
    sum = add; //크기와 상관없이 sum함수는 2개의 인자를 받을 수 있기 때문에 1개의 인자를 갖고 있는 add함수의 타입을 호환할 수 있음
    add = sum; //error - 크기와 상관없이 add함수는 1개의 인자만 받을 수 있기 때문에 에러가 발생함
    ジェニーリックのタイプ互換性
    interface Empty<T> {
      //..
    }
    
    var empty1: Empty<string>;
    var empty2: Empty<number>;
    
    empty1 = empty2;
    empty2 = empty1;
    
  • の値がない場合は、どの値でも互換性のあるタイプを定義します.
  • interface NotEmpty<T> {
      data: T;
    }
    var notempty1: NotEmpty<string>;
    var notempty2: NotEmpty<number>;
     
    notempty1 = notempty2; //error
    notempty2 = notempty1; //error
  • の構造タイプの違いが発生した場合、互換性はありません.