typescript学习

127 阅读1分钟

1.函数重载

image.png

注:实现签名必须兼容所有的重载签名(参数和返回值都要兼容处理)。

思考:既然实现签名中可以对传入参数的类型进行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.可选属性与只读属性

image.png

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,会出现报错。

image.png 因为索引签名应该是对整个接口里面属性的一个通配,所有属性都应被包含在索引签名的类型里面,因此用any比较稳妥。