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),則報錯。
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)文章
async/await實(shí)現(xiàn)Promise.all()的方式
Promise.all() 方法接收一個 promise 的 iterable 類型的輸入,并且只返回一個Promise實(shí)例,并且輸入的所有 promise 的 resolve 回調(diào)的結(jié)果是一個數(shù)組,對async/await實(shí)現(xiàn)Promise.all()相關(guān)知識感興趣的朋友一起看看吧2022-12-12JS簡單實(shí)現(xiàn)tab切換效果的多窗口顯示功能
這篇文章主要介紹了JS簡單實(shí)現(xiàn)tab切換效果的多窗口顯示功能,可實(shí)現(xiàn)響應(yīng)鼠標(biāo)事件的文字切換顯示效果,涉及javascript頁面元素遍歷與樣式變換相關(guān)操作技巧,需要的朋友可以參考下2016-09-09基于Bootstrap里面的Button dropdown打造自定義select
這篇文章主要介紹了基于Bootstrap里面的Button dropdown打造自定義select的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-05-05axios如何利用promise無痛刷新token的實(shí)現(xiàn)方法
這篇文章主要介紹了axios如何利用promise無痛刷新token的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08BootstrapTable refresh 方法使用實(shí)例簡單介紹
本文就bootstrapTable refresh 方法如何傳遞參數(shù)做簡單舉例說明,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-02-02javascript window.onerror事件學(xué)習(xí)新收獲
javascript window.onerror事件學(xué)習(xí)新收獲...2007-11-11