2017-01-20 4 views
0

Я хочу определить интерфейс с перегрузками функций и реализовать его.Как реализовать интерфейс TypeScript для функции?

Я могу это сделать:

export interface ServerRoutHandler 
{ 
    (opts: any, handlers: RequestHandler); 
    (opts: any, handlers: RequestHandler[]); 
    (opts: any, ...handlers: RequestHandler[]); 
    (opts: any, handlers: RequestCtxHandler); 
    (opts: any, handlers: RequestCtxHandler[]); 
    (opts: any, ...handlers: RequestCtxHandler[]); 
} 

, а затем этот

get:ServerRoutHandler = (opts: any, ...handlers: any[]) => 
{ 
    return this.factoryRouts('GET', opts, handlers); 
} 

post:ServerRoutHandler = (opts: any, ...handlers: any[]) => 
{ 
    return this.factoryRouts('POST', opts, handlers); 
} 

del:ServerRoutHandler = (opts: any, ...handlers: any[]) => 
{ 
    return this.factoryRouts('DELETE', opts, handlers); 
} 

Но, кажется, больше, как обходной путь и слегка изменяет поведение функции.

Есть ли другой синтаксис? Как это:

get<ServerRoutHandler>(opts: any, ...handlers: any[]) 
{ 
    return this.factoryRouts('GET', opts, handlers); 
} 
// It's not works as expected 
+0

Что вы подразумеваете под «слегка изменяет поведение функции»? В чем проблема? – Louis

+0

@Louis, если я реализую это в классе, это будет свойство, а не функция. – ktretyak

ответ

-1

, как вы это сделать, если вы реализуете get, post и del в классе, они фактически будут функции и отозваны. Единственная проблема, которую я вижу, заключается в том, что так, как вы это делаете, this не имеет определенного типа в этих функциях, и поэтому доступ к ней может быть проблемой. Однако, если вы укажете тип this в качестве первого аргумента, он позаботится о проблеме. Обратите внимание, что этот начальный аргумент this не добавляет новый параметр в вашу функцию, он должен только указать TypeScript, что такое тип this. Вот пример:

// I don't have your types. So I'm setting these to strings to that the code compiles. 
type RequestHandler = string; 
type RequestCtxHandler = string; 

interface ServerRouteHandler { 
    (opts: any, handlers: RequestHandler); 
    (opts: any, handlers: RequestHandler[]); 
    (opts: any, ...handlers: RequestHandler[]); 
    (opts: any, handlers: RequestCtxHandler); 
    (opts: any, handlers: RequestCtxHandler[]); 
    (opts: any, ...handlers: RequestCtxHandler[]); 
} 

// Example class that has methods that fit ServerRouteHandler 
class Something { 
    constructor(public x: number) { } 

    get: ServerRouteHandler = function get(this: Something, opts: any, ...handlers: any[]) { 
     console.log("get", this.x, opts, handlers); 
    } 
} 

const something = new Something(999); 
something.get({}, ["1"]); 

Если запустить это, вы получите get 999 Object Array[1] на консоли.

Я не знаю синтаксиса, который был бы более простым.

Смежные вопросы