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

轉發 TypeScript基礎入門之Javascript文件類型檢查(二)react

繼續上篇文章【TypeScript基礎入門之Javascript文件類型檢查(一)數組

對象文字是開放式的ide

在.ts文件中,初始化變量聲明的對象文字將其類型賦予聲明。不能添加未在原始文本中指定的新成員。此規則在.js文件中放寬;對象文字具備開放式類型(索引簽名),容許添加和查找最初未定義的屬性。例如:函數

var obj = { a: 1 };
obj.b = 2;  // Allowed

對象文字的行爲就像它們具備索引簽名[x:string]:任何容許它們被視爲開放映射而不是封閉對象的任何東西。this

與其餘特殊的JS檢查行爲同樣,能夠經過爲變量指定JSDoc類型來更改此行爲。例如:code

/** @type {{a: number}} */
var obj = { a: 1 };
obj.b = 2;  // Error, type {a: number} does not have property b

null,undefined和empty數組初始值設定項的類型爲any或any[]對象

使用null或undefined初始化的任何變量,參數或屬性都將具備類型any,即便打開了嚴格的空檢查。使用[]初始化的任何變量,參數或屬性都將具備類型any[],即便打開了嚴格的空檢查。惟一的例外是具備如上所述的多個初始值設定項的屬性。blog

function Foo(i = null) {
    if (!i) i = 1;
    var j = undefined;
    j = 2;
    this.l = [];
}
var foo = new Foo();
foo.l.push(foo.i);
foo.l.push("end");

功能參數默認是可選的索引

因爲沒法在ES2015以前的Javascript中指定參數的可選性,所以.js文件中的全部函數參數都被視爲可選參數。容許使用參數少於聲明的參數數量的調用。ip

重要的是要注意,調用具備太多參數的函數是錯誤的。

例如:

function bar(a, b) {
    console.log(a + " " + b);
}

bar(1);       // OK, second argument considered optional
bar(1, 2);
bar(1, 2, 3); // Error, too many arguments

JSDoc註釋函數被排除在此規則以外。使用JSDoc可選參數語法來表示可選性。例如:

/**
 * @param {string} [somebody] - Somebody's name.
 */
function sayHello(somebody) {
    if (!somebody) {
        somebody = 'John Doe';
    }
    console.log('Hello ' + somebody);
}

sayHello();

由arguments推斷出的var-args參數聲明

其主體具備對參數引用的引用的函數被隱式地認爲具備var-arg參數(即(...arg: any[]) => any)。使用JSDoc var-arg語法指定參數的類型。

/** @param {...number} args */
function sum(/* numbers */) {
    var total = 0
    for (var i = 0; i < arguments.length; i++) {
      total += arguments[i]
    }
    return total
}

未指定的類型參數默認爲any

因爲在Javascript中沒有用於指定泛型類型參數的天然語法,所以未指定的類型參數默認爲any。

在extends子句中:

例如,React.Component被定義爲具備兩個類型參數,Props和State。在.js文件中,沒有合法的方法在extends子句中指定它們。默認狀況下,類型參數將是any:

import { Component } from "react";

class MyComponent extends Component {
    render() {
        this.props.b; // Allowed, since this.props is of type any
    }
}

使用JSDoc @augments明確指定類型。例如:

import { Component } from "react";

/**
 * @augments {Component<{a: number}, State>}
 */
class MyComponent extends Component {
    render() {
        this.props.b; // Error: b does not exist on {a:number}
    }
}

在JSDoc引用中

JSDoc中的未指定類型參數默認爲any:

/** @type{Array} */
var x = [];

x.push(1);        // OK
x.push("string"); // OK, x is of type Array<any>


/** @type{Array.<number>} */
var y = [];

y.push(1);        // OK
y.push("string"); // Error, string is not assignable to number

在函數調用中

對泛型函數的調用使用參數來推斷類型參數。有時這個過程沒法推斷任何類型,主要是由於缺少推理源;在這些狀況下,類型參數將默認爲any。例如:

var p = new Promise((resolve, reject) => { reject() });

p; // Promise<any>;

未完待續...

相關文章
相關標籤/搜索