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

Bru*_*der 5 typescript

鉴于以下界面Fn

interface Fn<A> {
    (): A
}
Run Code Online (Sandbox Code Playgroud)

可以使用构建器实例化实现接口的对象

function buildFn<A>( val: A ): Fn<A> {
    return () => { return val }
}
Run Code Online (Sandbox Code Playgroud)

现在,使用以下在 Typescript 中有效的接口

interface FnString extends Fn<string> {
    (): string
    toLowerCase(): string
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:解决方案感谢@basarat

注意:重构String->string根据评论

function builderFn(str: string): FnString {
    var fn = <FnString>(() => str)
    fn.toLowerCase = str.toLowerCase
    return fn
}
Run Code Online (Sandbox Code Playgroud)

bas*_*rat 3

如果您想创建一个可调用且具有其他功能的对象,最好的方法是从一个对象开始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;
}
Run Code Online (Sandbox Code Playgroud)

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