TypeScript基礎入門之Javascript文件類型檢查(一)

轉載 TypeScript基礎入門之Javascript文件類型檢查(一)json

TypeScript 2.3及更高版本支持使用--checkJs在.js文件中進行類型檢查和報告錯誤。函數

您能夠經過添加//@ts-nocheck註釋來跳過檢查某些文件; 相反,您能夠經過在不設置--checkJs的狀況下向其添加//@ts-check註釋來選擇僅檢查幾個.js文件。 您還能夠經過在前一行添加//@ts-ignore來忽略特定行上的錯誤。 請注意,若是你有一個tsconfig.json,JS檢查將遵循嚴格的標誌,如noImplicitAny,strictNullChecks等。可是,因爲JS檢查相對鬆散,將嚴格的標誌與它結合可能會使人驚訝。ui

如下是.js文件中檢查與.ts文件相好比何工做的一些顯着差別:this

JSDoc類型用於類型信息prototype

在.js文件中,一般能夠像.ts文件同樣推斷類型。 一樣,當沒法推斷類型時,可使用JSDoc指定它們,就像在.ts文件中使用類型註釋同樣。 就像Typescript同樣, --noImplicitAny會給你編譯器沒法推斷類型的地方的錯誤。 (開放式對象文字除外;有關詳細信息,請參見下文。) 裝飾聲明的JSDoc註釋將用於設置該聲明的類型。 例如:code

/** @type {number} */
var x;

x = 0;      // OK
x = false;  // Error: boolean is not assignable to number

您能夠在JavaScript文檔中的JSDoc支持中找到受支持的JSDoc模式的完整列表。對象

屬性是從類體中的賦值推斷出來的blog

ES2015沒有在類上聲明屬性的方法。 屬性是動態分配的,就像對象文字同樣。ip

在.js文件中,編譯器從類主體內的屬性賦值中推斷屬性。 屬性的類型是構造函數中給出的類型,除非它沒有在那裏定義,或者構造函數中的類型是undefined或null。 在這種狀況下,類型是這些賦值中全部右側值的類型的並集。 始終假定構造函數中定義的屬性存在,而僅在方法,getter或setter中定義的屬性被視爲可選。ci

class C {
    constructor() {
        this.constructorOnly = 0
        this.constructorUnknown = undefined
    }
    method() {
        this.constructorOnly = false // error, constructorOnly is a number
        this.constructorUnknown = "plunkbat" // ok, constructorUnknown is string | undefined
        this.methodOnly = 'ok'  // ok, but y could also be undefined
    }
    method2() {
        this.methodOnly = true  // also, ok, y's type is string | boolean | undefined
    }
}

若是從未在類體中設置屬性,則將它們視爲未知。 若是您的類具備僅從中讀取的屬性,請使用JSDoc在構造函數中添加而後註釋聲明以指定類型。 若是稍後將初始化,您甚至沒必要提供值:

class C {
    constructor() {
        /** @type {number | undefined} */
        this.prop = undefined;
        /** @type {number | undefined} */
        this.count;
    }
}


let c = new C();
c.prop = 0;          // OK
c.count = "string";  // Error: string is not assignable to number|undefined

構造函數等同於類

在ES2015以前,Javascript使用構造函數而不是類。 編譯器支持此模式,並將構造函數理解爲與ES2015類等效。 上述屬性推理規則的工做方式徹底相同。

function C() {
    this.constructorOnly = 0
    this.constructorUnknown = undefined
}
C.prototype.method = function() {
    this.constructorOnly = false // error
    this.constructorUnknown = "plunkbat" // OK, the type is string | undefined
}

支持CommonJS模塊

在.js文件中,Typescript瞭解CommonJS模塊格式。 對exports和module.exports的賦值被識別爲導出聲明。 一樣,require函數調用被識別爲模塊導入。 例如:

// same as `import module "fs"`
const fs = require("fs");

// same as `export function readFile`
module.exports.readFile = function(f) {
    return fs.readFileSync(f);
}

Javascript中的模塊支持比Typescript的模塊支持更具語法上的寬容。 支持大多數分配和聲明組合。

類,函數和對象文字是名稱空間 類是.js文件中的命名空間。 這能夠用於嵌套類,例如:

class C {
}
C.D = class {
}

而且,對於ES2015以前的代碼,它能夠用於模擬靜態方法:

function Outer() {
  this.y = 2
}
Outer.Inner = function() {
  this.yy = 2
}

它還能夠用於建立簡單的命名空間:

var ns = {}
ns.C = class {
}
ns.func = function() {
}
// IIFE
var ns = (function (n) {
  return n || {};
})();
ns.CONST = 1

// defaulting to global
var assign = assign || function() {
  // code goes here
}
assign.extra = 1

未完待續...

相關文章
相關標籤/搜索