严格检查标记
- 使用–checkJs对js文件进行类型检查和错误提示
- 忽略类型检查:// @ts-nocheck
- 忽略本行的错误:// @ts-ignore
- 去掉–checkJs设置并添加一个// @ts-check注释来x选择检查某些.js文件
用JSDoc类型表示类型信息
- .js中类型和.ts中的类型一样可以被推断,类型推断不了使用JSDoc来指定
1
2
3/** @type {number} */
var x;
x = 0;
从类内部赋值语句推断属性声明
- ES2015/ES6不存在类属性的声明
- .js文件中,属性声明是由类内部的属性赋值语句推断出来的。
- 属性的类型是赋值语句右侧所有值的联合。
- 构造函数里定义的属性是永远存在的,在方法存取器里定义的被认为是可选的。
- 如果属性永远都不在类的内部被设置,那么它们被当成是未知的。
- 如果类具有只读的属性,考虑在构造函数里给它初始化成undefined。
更多注意点
- 构造函数等同于类
- 支持CommonJS模块
- 类,函数和对象字面量是命名空间
- 对象字面量是开放的
- null,undefined,和空数组的类型是any或any[]
- 函数参数是默认可选的
- 由arguments推断出的var-args参数声明
- 如果函数的体内有对arguments的引用,那么这个函数会隐式地被认为具有一个var-arg参数(比如:(…arg: any[]) => any)
- 未指定的类型参数默认为any
支持的JSDoc
@type: 引用一个类型名称
- 可以指定联合类型:@type {(string | boolean)},()是可选,
- 多种方式指定数组类型,
- 可指定对象字面量类型
1
2
3
4
5
6
7
8
9
10
11
12可使用字符串和数字索引签名来指定map-like 和array-like的对象
/** @type {Object.<number, object>} */
var arrayLike;
指定函数类型:
/** @type {(s: string, b: boolean) => number} Typescript syntax */
var sbn2;
直接使用未指定函数类型
/**
* @type {number | string}
*/
var numberOrString = Math.random() < 0.5 ? "hello" : 100;
var typeAssertedNumber = /** @type {number} */ (numberOrString)
@param (or @arg or @argument): 和@type相同
- 使用[]把参数声明为可选的:
1
2
3
4
5/** @typedef Pet { import("./a").Pet } // 导入类型从其它文件中导入声明 */
/** @type {Pet} */
var myPet;//可以使用类型别名
myPet.name;
- 使用[]把参数声明为可选的:
@returns (or @return) : 同上
@typedef: 声明复杂类型
@callback: 指定函数类型
@template: 声明泛型
@class (or @constructor): 通过this属性的赋值来推断构造函数,可以添加一个@constructor标记友好提示
@this: 通过上下文来推断出this的类型
@extends (or @augments): 只作用于类,指定类型参数的类型
@enum: 允许你创建一个对象字面量,它的成员都有确定的类型,不允许添加额外成员。