函数的类型
函数声明
function sum(x: number, y: number): number { return x + y; } sum(1, 2, 3); // 报错:输入多余的(或者少于要求的)参数,是不被允许的:
函数表达式
let mySum: (x: number, y: number) => number = function (x: number, y: number): number { return x + y; };
使用接口定义函数
interface SearchFunc { (source: string, subString: string): boolean; } let mySearch: SearchFunc; mySearch = function(source: string, subString: string) { return source.search(subString) !== -1; }
使用?来定义可选参数,注意可选参数必须靠后
function buildName(firstName: string, lastName?: string) { if (lastName) { return firstName + ' ' + lastName; } else { return firstName; } }
使用…来获取剩余参数
function push(array: any[], ...items: any[]) { items.forEach(function(item) { array.push(item); }); }
重载
重载允许一个函数接受不同数量或类型的参数时,作出不同的处理。
function reverse(x: number): number; function reverse(x: string): string; function reverse(x: number | string): number | string | void { if (typeof x === 'number') { return Number(x.toString().split('').reverse().join('')); } else if (typeof x === 'string') { return x.split('').reverse().join(''); } }
类型断言
类型断言(Type Assertion)可以用来手动指定一个值的类型。
值 as 类型
将一个父类断言为更加具体的子类
class ApiError extends Error { code: number = 0; } class HttpError extends Error { statusCode: number = 200; } function isApiError(error: Error) { if (typeof (error as ApiError).code === 'number') { //有点类似error instanceof ApiError return true; } return false; }
声明文件
当使用第三方库时,我们需要引用它的声明文件,才能获得对应的代码补全、接口提示等功能。
declare var jQuery: (selector: string) => any; //如果不声明全局变量,直接使用JQuery会报错 jQuery('#foo');
通常我们会把声明语句放到一个单独的文件(jQuery.d.ts)中,这就是声明文件3:
// src/jQuery.d.ts declare var jQuery: (selector: string) => any; // src/index.ts jQuery('#foo');
使用 @types安装已有的第三方声明文件
npm install @types/jquery --save-dev
Node.js 不是内置对象的一部分,如果想用 TypeScript 写 Node.js,则需要引入第三方声明文件:
npm install @types/node --save-dev