2015-05-26 7 views
3

Учитывая следующий интерфейс Fn,реализации интерфейса с «анонимным» метод

interface Fn<A> { 
    (): A 
} 

можно создать экземпляр объекта, реализующего интерфейс, используя построитель

function buildFn<A>(val: A): Fn<A> { 
    return() => { return val } 
} 

Теперь, используя следующий интерфейс, который действителен в машинописном документе

interface FnString extends Fn<string> { 
    (): string 
    toLowerCase(): string 
} 

ho w я пишу функцию строителя для создания экземпляра объекта, реализующего FnString?

редактировать: раствор благодаря @basarat

Примечание: переработан String ->string согласно комментарии

function builderFn(str: string): FnString { 
    var fn = <FnString>(() => str) 
    fn.toLowerCase = str.toLowerCase 
    return fn 
} 

ответ

2

Если вы хотите создать объект, который вызываемая и имеет другие функции , лучший способ сделать это - начать с объекта function. Однако, так как родной выведенный тип функции не соответствует фактическому типу вы строите, чтобы, вам необходимо утверждение типа:

interface Fn<A> { 
    (): A 
} 

function buildFn<A>(val: A): Fn<A> { 
    return() => { return val } 
} 

export interface FnString extends Fn<string> { 
    (): string 
    toLowerCase(): string 
} 

interface Awesome extends FnString { } 
export function builderFn(): Awesome { 
    var str = ('asdf'); 
    var fn = <Awesome>(() => str); 
    fn.toLowerCase = str.toLowerCase; 
    return fn; 
} 

Также отметим, что string не то же самое, как String и String приведен антипаттерн (следовательно, Я реорганизован на string).

+0

Спасибо; позвольте мне немного жевать это, и я вернусь к вам (String -> string; yes; спасибо, я набрал это вручную в SO) –

+0

Это работает, и, согласно моим тестам, нет необходимости в интерфейсе 'Awesome'. Несколько удивительно, что листинг 'var fn = (() => str)' переносится компилятором, хотя функция casted не имеет свойства 'toLowerCase' –

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