11.残りの属性チェックの制限があるかどうか



オブジェクト文字をタイプで指定された変数に割り当てると、tsはそのタイプの属性が存在するかどうか、および他の属性が存在するかどうかをチェックします.
  • 残余属性検査
  • interface Room {
      numDoors: number;
      ceilingHeightFt: number;
    }
    const r: Room = {
      numDoors: 1,
      ceilingHeightFt: 10,
      elephant: "present",
      // ~~~~~~~~~~~~~~~~~~ Object literal may only specify known properties,
      //                    and 'elephant' does not exist in type 'Room'
    };
    テストに一時変数を導入
    objタイプは、スタジオタイプのサブセットを含み、スタジオに割り当てられ、タイプフィルタによって
    interface Room {
      numDoors: number;
      ceilingHeightFt: number;
    }
    const obj = {
      numDoors: 1,
      ceilingHeightFt: 10,
      elephant: 'present',
    };
    const r: Room = obj;  // OK
    tsは、実行時に例外を投げ出すコードにエラーを表示するだけでなく、あなたの意図とは異なるコードを検索しようとします.
    interface Room {
      numDoors: number;
      ceilingHeightFt: number;
    }
    function setDarkMode() {}
    interface Options {
      title: string;
      darkMode?: boolean;
    }
    function createWindow(options: Options) {
      if (options.darkMode) {
        setDarkMode();
      }
      // ...
    }
    createWindow({
      title: 'Spider Solitaire',
      darkmode: true
    // ~~~~~~~~~~~~~ Object literal may only specify known properties, but
    //               'darkmode' does not exist in type 'Options'.
    //               Did you mean to write 'darkMode'?
    // darkmode가 아닌 darkMode로 사용해야됨
    });
    Optionsタイプの範囲が非常に広いため、純粋な構造化タイプフィルタではこのようなエラーを見つけることができません.
    ダークモードアトリビュートにブール以外の値を指定しない限り、文字列タイプtitleアトリビュートと他の任意のアトリビュートを持つすべてのオブジェクトはOptionsタイプの範囲に属します.
    interface Room {
      numDoors: number;
      ceilingHeightFt: number;
    }
    function setDarkMode() {}
    interface Options {
      title: string;
      darkMode?: boolean;
    }
    const o1: Options = document;  // OK
    const o2: Options = new HTMLAnchorElement;  // OK

    断言ではなく宣言を使用するのはなぜですか?

    interface Room {
      numDoors: number;
      ceilingHeightFt: number;
    }
    function setDarkMode() {}
    interface Options {
      title: string;
      darkMode?: boolean;
    }
    const o: Options = { darkmode: true, title: 'Ski Free' };
                      // ~~~~~~~~ 'darkmode' does not exist in type 'Options'...
    
    // 타입 구분 없는 임시 변수 
    const intermediate = { darkmode: true, title: 'Ski Free' }; // 객체 리터럴
    // 객체 리터럴이 아님
    const o: Options = intermediate;  // OK
    // 타입 단언문 사용
    const o = { darkmode: true, title: 'Ski Free' } as Options;  // OK
    同様のチェックは、オプションのアトリビュートのみを持つ弱い(週)タイプでも機能します.
    interface LineChartOptions {
      logscale?: boolean;
      invertedYAxis?: boolean;
      areaChart?: boolean;
    }
    const opts = { logScale: true };
    const o: LineChartOptions = opts;
       // ~ Type '{ logScale: boolean; }' has no properties in common
       //   with type 'LineChartOptions'