1.函数重载
注:实现签名必须兼容所有的重载签名(参数和返回值都要兼容处理)。
思考:既然实现签名中可以对传入参数的类型进行if判断来决定返回值类型,为什么还需要重载签名? 示例:假设一个函数fn有两种可选的传参形式:1.传入name返回boolean 2.传入name,age和gender返回字符串,若不使用重载签名,而是直接使用实现签名,则可能会出现第三种传参形式,即只传入name和age,如下:
function fn(name:string,age?:number,job?:string[]) {
//如果age信息存在
if(age) {
return `age存在,且${name}的age是${age},参加过的job数量是${job.length}`;
}
else {
return false;
}
}
//传入一个参数,正确
fn('zhangsan')
//传入两个参数,不报错,但执行时会报错TypeError: Cannot read property 'length' of undefined
fn('zhangsan',20)
//传入三个参数,正确
fn('zhangsan',20,['student','policeman'])
可以看到,只有实现签名的话ts无法在编译前就判断出函数的传参是否有问题。
function fn(name:string):string;
function fn(name:string,age:number,job:string[]):string
function fn(name:string,age?:number,job?:string[]) {
if(name) {
return `只有name信息`;
}
//如果age信息存在
else {
return `age存在,且${name}的age是${age},参加过的job数量是${job.length}`;
}
}
//传入一个参数,正确
fn('zhangsan')
//传入两个参数,报错
fn('zhangsan',20)
//传入三个参数,正确
fn('zhangsan',20,['student','policeman'])
使用函数重载会在代码编写阶段直接报错。
2.可选属性与只读属性
3.索引签名
typescript中,当键值对中的值类型不确定时,可以用索引签名[xxx:string]:any。
interface Person {
name: string;
age: number;
[xxx: string]: any;
}
const person2:Person = {
name:'wangwu',
age:12,
score:'A'
}
注意,这里[xxx:string]:any如果将any改为string,会出现报错。
因为索引签名应该是对整个接口里面属性的一个通配,所有属性都应被包含在索引签名的类型里面,因此用
any比较稳妥。