下面来说一下在函数中的断言,首先来看下面的代码:

    1. let func3 = ()=> {
    2. const str: string = 'hello,TypeScript';
    3. const fn = (x:number, y:number): number=> x + y;
    4. return [str, fn];
    5. }

    上面的代码中,定义了一个函数,函数的返回值是一个数组,数组的类型为stringFunction

    此时调用函数并且接收参数。

    // 以解构赋值的形式来接收函数的参数
    let [s1, f1] = func3();
    

    当我们以解构赋值的形式接收了函数的返回值后,s1和f1的类型变成了和函数返回值的类型相同的类型:

    image.png
    image.png

    此时作为开发者,我们是知道f1是一个函数的,但是ts却识别不出,此时如果直接调用f1,那么程序就会出现错误。

    image.png
    解决这个问题,可以使用断言。

    let [s1, f1] = func3(); 
    
    (f1 as Function)(10,20);
    

    也可以采用下面这种写法:

    let [s1, f1] = func3() as [string, Function]; 
    
    f1(10, 20);
    

    image.png
    当然,在构建函数的初期,还可以直接指定返回值的类型,这样也可以避免出现的问题。

    let func3 = (): [string, Function] => {
        const str: string = 'hello,TypeScript';
        const fn = (x: number, y: number): number => x + y;
        return [str, fn];
    };
    
    // 以解构赋值的形式来接收函数的参数
    // let [s1, f1] = func3() as [string, Function]; 
    let [s1, f1] = func3(); 
    
    f1(10, 20);
    

    如果想要在函数调用的时候,获得更加清楚的参数提示,也可以在定义函数的时候或者在进行类型断言的时候,设置好参数和返回值的类型。

    第一种情况,在定义函数的时候,设置函数的返回值:
    image.png
    第二种情况,在进行类型断言的时候,设置函数的返回值:

    image.png
    第三种情况,在编写函数的过程中,可以在return 语句的后面加上类型断言。

    image.png
    或者直接在return的后面使用typeof也是可以的。
    image.png
    该种写法和上面的写法效果是相同的。

    最简单的方法,是可以直接将返回值变为元组,效果和之前的写法相同。
    image.png