轉發 TypeScript基礎入門之Javascript文件類型檢查(五)express
繼續上篇文章【TypeScript基礎入門之Javascript文件類型檢查(四)】less
編譯器根據此屬性賦值推斷構造函數,但若是添加@constructor標記,則能夠更好地檢查更嚴格和更好的建議:post
/** * @constructor * @param {number} data */ function C(data) { this.size = 0; this.initialize(data); // Should error, initializer expects a string } /** * @param {string} s */ C.prototype.initialize = function (s) { this.size = s.length } var c = new C(0); var result = C(1); // C should only be called with new
使用@constructor,在構造函數C中檢查它,所以您將得到初始化方法的建議,若是您傳遞一個數字,則會出錯。 若是您調用C而不是構造它,您也會收到錯誤。this
不幸的是,這意味着也能夠調用的構造函數不能使用@constructor。spa
@this.net
當編譯器有一些上下文能夠使用時,它一般能夠找出它的類型。 若是沒有,您能夠使用@this顯式指定此類型:prototype
/** * @this {HTMLElement} * @param {*} e */ function callbackForLater(e) { this.clientHeight = parseInt(e) // should be fine! }
@extendsrest
當Javascript類擴展通用基類時,無處可指定類型參數應該是什麼。 @extends標記爲該類型參數提供了一個位置:code
/** * @template T * @extends {Set<T>} */ class SortableSet extends Set { // ... }
請注意,@ extends僅適用於類。 目前,構造函數沒有辦法擴展一個類。
@enum
@enum標記容許您建立一個對象文字,其成員都是指定的類型。 與Javascript中的大多數對象文字不一樣,它不容許其餘成員。
/** @enum {number} */ const JSDocState = { BeginningOfLine: 0, SawAsterisk: 1, SavingComments: 2, }
請注意,@enum與Typescript的枚舉徹底不一樣,而且簡單得多。 可是,與Typescript的枚舉不一樣,@enum能夠有任何類型:
/** @enum {function(number): number} */ const Math = { add1: n => n + 1, id: n => -n, sub1: n => n - 1, }
更多示例
var someObj = { /** * @param {string} param1 - Docs on property assignments work */ x: function(param1){} }; /** * As do docs on variable assignments * @return {Window} */ let someFunc = function(){}; /** * And class methods * @param {string} greeting The greeting to use */ Foo.prototype.sayHi = (greeting) => console.log("Hi!"); /** * And arrow functions expressions * @param {number} x - A multiplier */ let myArrow = x => x * x; /** * Which means it works for stateless function components in JSX too * @param {{a: string, b: number}} test - Some param */ var sfc = (test) => <div>{test.a.charAt(0)}</div>; /** * A parameter can be a class constructor, using Closure syntax. * * @param {{new(...args: any[]): object}} C - The class to register */ function registerClass(C) {} /** * @param {...string} p1 - A 'rest' arg (array) of strings. (treated as 'any') */ function fn10(p1){} /** * @param {...string} p1 - A 'rest' arg (array) of strings. (treated as 'any') */ function fn9(p1) { return p1.join(); }
引用值空間中的對象,由於類型不起做用,除非對象也建立類型,如構造函數。
function aNormalFunction() { } /** * @type {aNormalFunction} */ var wrong; /** * Use 'typeof' instead: * @type {typeof aNormalFunction} */ var right;
對象文字類型中的屬性類型的Postfix等於未指定可選屬性:
/** * @type {{ a: string, b: number= }} */ var wrong; /** * Use postfix question on the property name instead: * @type {{ a: string, b?: number }} */ var right;
若是啓用了strictNullChecks,則可空類型僅具備意義:
/** * @type {?number} * With strictNullChecks: true -- number | null * With strictNullChecks: off -- number */ var nullable;
非可空類型沒有任何意義,而且被視爲原始類型:
/** * @type {!number} * Just has type number */ var normal;
與JSDoc的類型系統不一樣,Typescript只容許您將類型標記爲包含null或不包含null。 沒有明確的非可空性 - 若是啓用了strictNullChecks,則number不可爲空。 若是它關閉,則number能夠爲空。