让前端飞

TypeScript——JavaScript文件类型检查(二)

2019-12-28  本文已影响0人  2o壹9

由arguments推断出的var-args参数声明

如果一个函数的函数体内有对arguments的引用,那么这个函数会隐式地被认为具有一个var-arg参数(比如:(...arg: any[]) => any))。使用JSDoc的var-arg语法来指定arguments的类型。

/** @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

在函数调用中

泛型函数的调用使用arguments来推断泛型参数。有时候,这个流程不能够推断出类型,大多是因为缺少推断的源;在这种情况下,类型参数类型默认为any。例如:

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

p; // Promise<any>;

上一篇下一篇

猜你喜欢

热点阅读