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)文章!
- 使用?TypeScript?開發(fā)?React?函數(shù)式組件
- TypeScript?泛型重載函數(shù)的使用方式
- TypeScript防抖節(jié)流函數(shù)示例詳解
- TypeScript函數(shù)和類型斷言實(shí)例詳解
- Typescript 函數(shù)重載的實(shí)現(xiàn)
- TypeScript中的函數(shù)
- Typescript中函數(shù)類型及示例詳解
- TypeScript使用函數(shù)重載確定返回類型的實(shí)現(xiàn)方法
- 如何在TypeScript中使用函數(shù)
- TypeScript中的函數(shù)重載示例分析
- TypeScript中使用回調(diào)函數(shù)的實(shí)現(xiàn)
相關(guān)文章
JS注冊/移除事件處理程序(ExtJS應(yīng)用程序設(shè)計(jì)實(shí)戰(zhàn))
最常做的事情就是注冊事件處理程序,因?yàn)樵贓xtJS的世界里,幾乎完全由時間組成,下面是處理程序案例,感興趣的朋友可以參考下哈,希望可以幫助到你2013-05-05
JavaScript隨機(jī)打亂數(shù)組順序之隨機(jī)洗牌算法
這篇文章主要介紹了JavaScript隨機(jī)打亂數(shù)組順序之隨機(jī)洗牌算法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08
微信小程序?qū)W習(xí)筆記之跳轉(zhuǎn)頁面、傳遞參數(shù)獲得數(shù)據(jù)操作圖文詳解
這篇文章主要介紹了微信小程序?qū)W習(xí)筆記之跳轉(zhuǎn)頁面、傳遞參數(shù)獲得數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了微信小程序基于navigator組件的頁面跳轉(zhuǎn)及數(shù)據(jù)傳遞相關(guān)操作技巧,并結(jié)合圖文形式進(jìn)行詳細(xì)說明,需要的朋友可以參考下2019-03-03
JavaScript前端面試扁平數(shù)據(jù)轉(zhuǎn)tree與tree數(shù)據(jù)扁平化
這篇文章主要為大家介紹了JavaScript面試中扁平數(shù)據(jù)轉(zhuǎn)tree以及tree數(shù)據(jù)扁平化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
使用雪花算法產(chǎn)生id導(dǎo)致前端精度缺失問題解決方案
雪花算法由Twitter提出,設(shè)計(jì)目的是生成唯一的、遞增的ID,下面這篇文章主要介紹了使用雪花算法產(chǎn)生id導(dǎo)致前端精度缺失問題的解決方案,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-05-05
a標(biāo)簽click和href執(zhí)行順序探討
這篇文章主要介紹了a標(biāo)簽click和href執(zhí)行順序,需要的朋友可以參考下2014-06-06
函數(shù)window.open實(shí)現(xiàn)關(guān)閉所有的子窗口
這篇文章主要介紹了函數(shù)window.open實(shí)現(xiàn)關(guān)閉所有的子窗口的相關(guān)資料,需要的朋友可以參考下。2015-08-08

