Typescript 實(shí)現(xiàn)函數(shù)重載的方式
函數(shù)重載
JavaScript并沒(méi)有提供函數(shù)重載
TypeScript提供的函數(shù)重載,僅僅用作提示效果,實(shí)現(xiàn)還需手動(dòng)
函數(shù)重載簡(jiǎn)單點(diǎn)說(shuō)就是,同一個(gè)函數(shù)的不同實(shí)現(xiàn)方式,根據(jù)傳入的參數(shù)的類型或者長(zhǎng)度,決定最終調(diào)用哪一個(gè)實(shí)現(xiàn)
最終效果,TypeScript的類型校驗(yàn)也會(huì)變化




code
創(chuàng)建函數(shù)重載函數(shù)
根據(jù)參數(shù)的類型,調(diào)用不同的實(shí)現(xiàn),如果沒(méi)有對(duì)應(yīng)的實(shí)現(xiàn),則報(bào)錯(cuò)。
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)樯鲜鍪褂脹](méi)有代碼提示,離了代碼提示活不下去了
創(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ù)的映射表,用于繼承類的多個(gè)函數(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ù)重載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
async/await實(shí)現(xiàn)Promise.all()的方式
Promise.all() 方法接收一個(gè) promise 的 iterable 類型的輸入,并且只返回一個(gè)Promise實(shí)例,并且輸入的所有 promise 的 resolve 回調(diào)的結(jié)果是一個(gè)數(shù)組,對(duì)async/await實(shí)現(xiàn)Promise.all()相關(guān)知識(shí)感興趣的朋友一起看看吧2022-12-12
JS簡(jiǎn)單實(shí)現(xiàn)tab切換效果的多窗口顯示功能
這篇文章主要介紹了JS簡(jiǎn)單實(shí)現(xiàn)tab切換效果的多窗口顯示功能,可實(shí)現(xiàn)響應(yīng)鼠標(biāo)事件的文字切換顯示效果,涉及javascript頁(yè)面元素遍歷與樣式變換相關(guān)操作技巧,需要的朋友可以參考下2016-09-09
基于Bootstrap里面的Button dropdown打造自定義select
這篇文章主要介紹了基于Bootstrap里面的Button dropdown打造自定義select的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05
axios如何利用promise無(wú)痛刷新token的實(shí)現(xiàn)方法
這篇文章主要介紹了axios如何利用promise無(wú)痛刷新token的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
給頁(yè)面渲染時(shí)間加速 干掉Dom Level 0 Event
我們?nèi)サ羰录壎ǖ倪壿?發(fā)現(xiàn)只渲染dom元素,不綁定事件的時(shí)間,僅僅125ms,可見(jiàn)事件綁定的時(shí)間消耗還是很大的 ,尤其是第一種方式,也就是Dom Level 0 Event,最為耗時(shí)2012-12-12
BootstrapTable refresh 方法使用實(shí)例簡(jiǎn)單介紹
本文就bootstrapTable refresh 方法如何傳遞參數(shù)做簡(jiǎn)單舉例說(shuō)明,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-02-02
javascript window.onerror事件學(xué)習(xí)新收獲
javascript window.onerror事件學(xué)習(xí)新收獲...2007-11-11

