当前位置: 代码网 > it编程>编程语言>Javascript > Typescript 实现函数重载的方式

Typescript 实现函数重载的方式

2024年05月26日 Javascript 我要评论
函数重载javascript并没有提供函数重载typescript提供的函数重载,仅仅用作提示效果,实现还需手动函数重载简单点说就是,同一个函数的不同实现方式,根据传入的参数的类型或者长度,决定最终调

函数重载

javascript并没有提供函数重载

typescript提供的函数重载,仅仅用作提示效果,实现还需手动

函数重载简单点说就是,同一个函数的不同实现方式,根据传入的参数的类型或者长度,决定最终调用哪一个实现

最终效果,typescript的类型校验也会变化

code

创建函数重载函数

根据参数的类型,调用不同的实现,如果没有对应的实现,则报错。

export function createoverload () {

    const map: map<string, function> = new map();

    const overload = ( ...args: any[] ) => {

        const key = args.map( it => typeof it ).join( " " );

        const fn = map.get( key );

        if ( !fn ) throw new error( "no overload function matched" );

        return fn( args );
    };

    overload.addimpl = function ( args: array<"number" | "string" | "boolean" | "function" | "object" | "symbol" | "undefined" | "bigint">, fn: function ) {

        if ( typeof fn !== "function" ) throw new error( "last argument must be a function" );

        const key = args.join( " " );

        map.set( key, fn );

    };

    return overload;

}

使用

    const overload = createoverload()
    
    overload.addimpl(["string","number"],()=>{
        console.log("string number")
    })
    overload.addimpl(["number","string"],()=>{
        console.log("number string")
    })
    
    overload("yang jun",18) // console.log("string number")
    overload(18,"yang jun") // console.log("number string")

封装一层,因为上述使用没有代码提示,离了代码提示活不下去了

创建抽象类。

在js中创建抽象类方法,在construct中执行 if( new.target === overload ) throw new error("不允许直接new")

在下述实现中,转为 es6 类实现,新增了重载函数的映射表,用于继承类的多个函数的重载。

export abstract class overload {

    private overloads = new map<string, function>();

    protected addimpl ( name: string, args: array<"string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function">, fn: function ) {

        let overload = null;

        if ( this.overloads.has( name ) ) {

            overload = this.overloads.get( name );

        } else {

            overload = createoverload();

            this.overloads.set( name, overload );

        }

        overload.addimpl( args, fn );
    };

    protected getoverload ( name: string ): function | undefined {

        if ( this.overloads.has( name ) ) return this.overloads.get( name );

        throw new error( "no overload matched" );

    }

}

使用

非常舒服,再也不用自己在函数中写一串的 if 了

import { overload } from "./utils";

class test extends overload {

    constructor () {

        super();

        this.addimpl( "getinfo", [ "boolean", "number", "string" ], () => {
            console.log( "boolean", "number", "string" );
        } );
        this.addimpl( "getinfo", [ "number", "string", "boolean" ], () => {
            console.log( "number", "string", "boolean" );
        } );
        this.addimpl( "getinfo", [ "string", "number", "boolean" ], () => {
            console.log( "string", "number", "boolean" );
        } );

    }

    getinfo ( age: number, name: string, ishandsome: boolean ): object;
    getinfo ( ishandsome: boolean, age: number, name: string ): object;
    getinfo ( name: string, age: number, ishandsome: boolean ): object;

    getinfo (): object {
        const overload = this.getoverload( "getinfo" );
        return overload( ...arguments );
    }

    getname ( name: string ) {

    }

}

const test = new test();

test.getinfo( 18, "yang jun", true );  //    console.log( "number", "string", "boolean" );

test.getinfo( "yang jun", 18, true );  //  console.log( "string", "number", "boolean" );

test.getinfo( true, 18, "yang jun" ); //   console.log( "boolean", "number", "string" );

以上就是typescript 实现函数重载的方式的详细内容,更多关于typescript函数重载的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com