使用“匿名”方法实现接口

时间:2015-05-26 05:02:05

标签: typescript

给定以下接口Fn

interface Fn<A> {
    (): A
}

可以使用构建器

实例化实现接口的对象
function buildFn<A>( val: A ): Fn<A> {
    return () => { return val }
}

现在,使用以下在Typescript

中有效的界面
interface FnString extends Fn<string> {
    (): string
    toLowerCase(): string
}

如何编写构建器函数来实例化实现FnString的对象?

编辑:解决方案感谢@basarat

注意:重构String - &gt; string根据评论

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

1 个答案:

答案 0 :(得分:2)

如果要创建 callable 并具有其他功能的对象,最好的方法是从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;
}

另请注意,stringString不同,String是反模式(因此我重构为string)。