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

由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>;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容