稍微粗心大意的人, 如果上面程式碼是用Javascript 會不知道發生甚麼錯誤. 但在Typescript 會告知你

'this' implicitly has type 'any' because it does not have a type annotation.

看出來了嗎? 上面 getLabel() 方法中, this.label 沒有宣告就進行使用 toUpperCase()

所以上面程式碼應該改成如下

const config = {   
   label: 'Hello Typescript World',
   getLabel(): string {     
      return this.label.toUpperCase();

但我們最好宣告這是甚麼類型, 最好是明確宣告介面, 更能確保程式碼可讀性, 以及正確性

interface IMyConfig {   
   label: string;
   getLabel: () => string;
const config: IMyConfig = {   
   label: 'Hello Typescript World',
   getLabel() {     
     return this.label.toUpperCase();
  • strictNullChecks
    檢查方法是否有可能回傳 null 或 undefined 的可能性
  • class PlayerInfo {
       id: number;
    function getPlayerInfoById (data: PlayerInfo[], id: number): PlayerInfo {   
       const player = data.find(x => x.id === id);
       return player;
    

    Typescript 會提醒以下錯誤訊息

    Type 'PlayerInfo | undefined' is not assignable to type 'PlayerInfo'.
      Type 'undefined' is not assignable to type 'PlayerInfo'.
    

    此時你就會知道 data.find() 有可能回傳 undefined 值, 所以你得修改程式碼如下

    function getPlayerInfoById(data: PlayerInfo[], id: number): PlayerInfo {   
       const player = data.find(x => x.id === id);
       if (player === undefined) {     
          throw new Error(`Could not find an article with id: ${id}.`)   
       return player;
    

    瞧! Typescript 多細心阿!

    strictPropertyInitialization

    要在構造函數(constructor)內部初始化, 或在構造之前已定義的類別中的屬性

    看看下面的個例子

    class Student {   
       name: string;
    

    Typescript 會顯示以下錯誤訊息, 告知 name 屬性沒有初值.

    Property 'name' has no initializer and is not definitely assigned in the constructor.
    

    所以在這模式下, 你必須對所有屬性做初始化, 不能甚麼都沒有

    class Student {
       name: string = "";
    
  • strictBindCallApply
  • 檢查你正在使用bind, call, apply 在方法中定義的參數類型和數量

    以下範例示範 sum 方法

    function sum (num1: number, num2: number): number {   
       return num1 + num2;
    sum.apply(null, (1, 2, 3));
    

    Typescript 會找出你apply 傳入的參數有錯誤

    Argument of type '3' is not assignable to parameter of type '[number, number]'.
    Left side of comma operator is unused and has no side effects.
    

    上述程式碼應該修正為

    sum.apply(null, [1, 2]);