最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Typescript 實(shí)現(xiàn)函數(shù)重載的方式

 更新時(shí)間:2024年05月11日 08:42:52   作者:你也向往長安城嗎  
函數(shù)重載簡單點(diǎn)說就是,同一個函數(shù)的不同實(shí)現(xiàn)方式,根據(jù)傳入的參數(shù)的類型或者長度,決定最終調(diào)用哪一個實(shí)現(xiàn),本文給大家介紹了Typescript 實(shí)現(xiàn)函數(shù)重載的方式,需要的朋友可以參考下

函數(shù)重載

JavaScript并沒有提供函數(shù)重載

TypeScript提供的函數(shù)重載,僅僅用作提示效果,實(shí)現(xiàn)還需手動

函數(shù)重載簡單點(diǎn)說就是,同一個函數(shù)的不同實(shí)現(xiàn)方式,根據(jù)傳入的參數(shù)的類型或者長度,決定最終調(diào)用哪一個實(shí)現(xiàn)

最終效果,TypeScript的類型校驗(yàn)也會變化

code

創(chuàng)建函數(shù)重載函數(shù)

根據(jù)參數(shù)的類型,調(diào)用不同的實(shí)現(xiàn),如果沒有對應(yīng)的實(shí)現(xiàn),則報(bào)錯。

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")

封裝一層,因?yàn)樯鲜鍪褂脹]有代碼提示,離了代碼提示活不下去了

創(chuàng)建抽象類。

在JS中創(chuàng)建抽象類方法,在construct中執(zhí)行 if( new.target === Overload ) throw new Error("不允許直接new")

在下述實(shí)現(xiàn)中,轉(zhuǎn)為 es6 類實(shí)現(xiàn),新增了重載函數(shù)的映射表,用于繼承類的多個函數(shù)的重載。

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" );

    }

}

使用

非常舒服,再也不用自己在函數(shù)中寫一串的 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 實(shí)現(xiàn)函數(shù)重載的方式的詳細(xì)內(nèi)容,更多關(guān)于Typescript函數(shù)重載的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Raphael帶文本標(biāo)簽可拖動的圖形實(shí)現(xiàn)代碼

    Raphael帶文本標(biāo)簽可拖動的圖形實(shí)現(xiàn)代碼

    Javascript和Raphael順便學(xué)習(xí)了一下,主要是為了實(shí)現(xiàn)一個可拖動的矩形同時(shí)矩形上還得顯示標(biāo)簽,網(wǎng)上關(guān)于這方面的知識提的很是于是本人自不量力寫了一下,感興趣的你可不要錯過了哈,希望可以幫助到你
    2013-02-02
  • 一些常見的TypeScript面試題匯總

    一些常見的TypeScript面試題匯總

    TS是強(qiáng)類型的JS超集,支持ES6語法,支持面向?qū)ο缶幊痰母拍?如類、接口、繼承、泛型等,下面這篇文章主要給大家介紹了關(guān)于一些常見的TypeScript面試題的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • 使用JS獲取當(dāng)前地理位置的2種方法舉例

    使用JS獲取當(dāng)前地理位置的2種方法舉例

    這篇文章主要給大家介紹了關(guān)于使用JS獲取當(dāng)前地理位置的2種方法,獲取當(dāng)前位置在實(shí)際場景中非常有用,比如定位用戶的位置,為其推薦周邊的商家和服務(wù)等,需要的朋友可以參考下
    2023-11-11
  • 關(guān)于Error:Unknown?option?'--inline'報(bào)錯的解決辦法

    關(guān)于Error:Unknown?option?'--inline'報(bào)錯的解決辦法

    這篇文章主要給大家介紹了關(guān)于Error:Unknown?option?'--inline'報(bào)錯的解決辦法,文中將解決的辦法介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • JavaScript簡單實(shí)現(xiàn)合并兩個Json對象的方法示例

    JavaScript簡單實(shí)現(xiàn)合并兩個Json對象的方法示例

    這篇文章主要介紹了JavaScript簡單實(shí)現(xiàn)合并兩個Json對象的方法,結(jié)合實(shí)例形式分析了json對象的遍歷、添加實(shí)現(xiàn)合并的相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • JavaScript定時(shí)器原理詳解

    JavaScript定時(shí)器原理詳解

    這篇文章主要介紹了JavaScript定時(shí)器原理,setTimeout()方法用于設(shè)置一個定時(shí)器,該定時(shí)器在定時(shí)器到期后執(zhí)行調(diào)用函數(shù),文章圍繞JavaScript定時(shí)器相關(guān)資料展開以下內(nèi)容,需要的朋友可以參考一下
    2021-12-12
  • javascrip關(guān)于繼承的小例子

    javascrip關(guān)于繼承的小例子

    javascrip關(guān)于繼承的小例子,需要的朋友可以參考一下
    2013-05-05
  • JS IE和FF兼容性問題匯總

    JS IE和FF兼容性問題匯總

    以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila FF,對于js愛好者必看的一些知識總結(jié)。
    2009-02-02
  • 深入理解JS的事件綁定、事件流模型

    深入理解JS的事件綁定、事件流模型

    這篇文章主要介紹了JS的事件綁定、事件流模型的相關(guān)知識,非常不錯,具有參考借鑒價(jià)值,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-05-05
  • JS查找字符串中出現(xiàn)次數(shù)最多的字符

    JS查找字符串中出現(xiàn)次數(shù)最多的字符

    本文給大家?guī)韮煞Njs中查找字符串中出現(xiàn)次數(shù)最多的字符,在這兩種方法中小編推薦使用第二種,對js查找字符串出現(xiàn)次數(shù)的相關(guān)知識感興趣的朋友一起看看吧
    2016-09-09

最新評論

华坪县| 宜都市| 南乐县| 宜兰市| 营山县| 垣曲县| 龙州县| 介休市| 永丰县| 长宁县| 秦皇岛市| 剑川县| 新乡市| 江北区| 双牌县| 榕江县| 沙田区| 佛教| 宁陵县| 灵川县| 黄山市| 瓦房店市| 平果县| 阳信县| 普兰县| 泸定县| 岳池县| 遂宁市| 双峰县| 长垣县| 天台县| 黑龙江省| 凤城市| 盐城市| 镶黄旗| 玛曲县| 阳山县| 五峰| 贺州市| 绥化市| 盈江县|