TypeScript中的函数
参数
默认参数
function getBiggerHeight(height: number, unit: string = 'px') {
return height * 2 + unit;
}
getBiggerHeight(20); // 获得40px
getBiggerHeight(30, 'em'); // 获得60em
可选参数
// 用户注册函数
function register(name: string, password: string, age?: number) {
console.log(`记录注册信息-用户名:${name},密码:${password}` + (age ? `,年龄:${age}` : ''));
}
register('Lcng', '1'); // 输出“记录注册信息-用户名:Lcng,密码:1”
register('Lcng', '1', 3); // 输出“记录注册信息-用户名:Lcng,密码:1,年龄:3”
剩余参数
// 添加联系方式
function addContact(phone: string, ...addresses:string[]) {
console.log(`记录联系方式-电话号码:${phone}` + (addresses && addresses.length ? `,地址:${addresses.join(',')}` : ''));
}
addContact('13111111111'); // 输出“记录联系方式-电话号码:13111111111”
// 输出“记录联系方式-电话号码:13111111111,地址:Baker Street 221B”
addContact('13111111111', 'Baker Street 221B');
// 输出“记录联系方式-电话号码:13111111111,地址:Baker Street 221B, Calle Bleeckrr 177A”
addContact('13111111111', 'Baker Street 221B', 'Calle Bleeckrr 177A');
// 错误:类型“string[]”的值不能赋给类型“string”的参数
// addContact('13111111111', ['Baker Street 221B', 'Calle Bleeckrr 177A'])
// 输出“记录联系方式-电话号码:13111111111,地址:Baker Street 221B, Calle Bleeckrr 177A”
addContact('13111111111', ...['Baker Street 221B', 'Calle Bleeckrr 177A'])
函数类型
// 加法函数
function add(x: number, y: number): number {
return x + y;
}
let typeOfAdd = typeof (add); // 得到字符串function
let myAdd: (x: number, y: number) => number = add;
// let myAdd_2: function = add; // 错误,不存在类型function
类型别名
type containingType = (x: string, y: string) => boolean;
type comparingType = (x: string, y: string) => boolean;
// 尽管以上两个类型别名是等价的,但我们不能使用等于号(“==”或“===”)对它们进行比较,因为等于号仅用于值的比较,而类型(别名)不是值
// 判断指定字符串是否包含另一个子字符串的函数变量
let contains: containingType = function (x: string, y: string): boolean {
return x.indexOf(y) > -1;
}
// 按字典顺序判断指定的一个字符串是否大于指定的另一个字符串
let greaterThan: comparingType = function (x: string, y: string): boolean {
return x > y;
}
// 获取函数变量greaterThan的类型别名
type greaterThanType = typeof greaterThan; // 获取编译时类型
let typeOfGreaterThan: string = typeof greaterThan; // 获取运行时类型
类型兼容
/**
* 模拟jQuery中的ajax()函数
* @param url 要访问的URL
* @param callback 服务端返回响应后要执行的回调函数
*/
function ajax(url: string, callback: (response: string, statusCode: number, statusText: string) => void) {
// 省略了异步请求
// 服务端返回响应后,执行调用方提供的回调函数
callback('服务端响应字符串', 0, '调用成功');
}
// 异步访问http://localhost:3000/ajax
ajax('http://localhost:3000/ajax', function (res: string, code: number, text: string): void {
if (code !== 0) {
console.log('调用失败');
return;
}
console.log(res);
});
// 计算函数变量
let calculate: (x: number, y: number, operator: string) => number;
calculate = function (a: number, b: number): number {
return a + b;
}
// 错误,类型不兼容
// calculate = function(a: string, b: string): number {
// return (a + b).length;
// }
/**************************参数类型兼容*****************************/
calculate = function (x: any, y: any): number {
return x * y;
}
// 错误:类型number和null不兼容
// calculate = function (x: null, y: null): number {
// return 0;
// }
/**************************返回类型兼容*****************************/
calculate = function (x: number, y: number): any {
return x - y;
}
// 错误:类型undefined不兼容于number
// calculate = function(x: number, y: number) : undefined {
// return undefined;
// }
/********兼容任何函数类型的函数类型(...args: any[]) => void*******/
type baseType = (...args: any[]) => void;
let func1: baseType = function () {
console.log('func1');
}
let func2: baseType = function (n: number, s: string): string {
return n + s;
}
let func3: baseType = function (b: boolean): boolean {
return !b;
}
let func4: baseType = function (): never {
throw 'error..';
}
函数重载
function add(x: number, y: number): number; // 加法运算函数
function add(x: string, y: string): string; // 字符串拼接函数
function add(x: any, y: any): any {
return x + y; // 加法运算或字符串拼接的实现
}
let sum: number = add(1, 3); // 得到3
let fullName: string = add('L', 'cng'); // 得到Lcng
// 错误,这看上去是在合法地调用类型为(x: any, y: any) => any的实现函数,但TypeScript编译器不允许实现函数被直接调用
// let address: string = add('Baker Street', 211);
function subtract(x: number, y: number): number; // 两个数的减法
function subtract(x: number, y: number, z: number): number; // 三个数的减法
function subtract(x: number, y: number, z?: number): number { // 参数z应是可选参数
return (z === null || z === undefined) ? (x - y) : (x - y - z)
}
let difference = subtract(1, 2); // 获得-1
difference = subtract(1, 2, 3); // 获得-4
// difference = subtract (1, 2, 3, 4); // 错误,subtract()函数没有接受4个参数的重载