给定以下接口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
}
答案 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;
}
另请注意,string
与String
不同,String
是反模式(因此我重构为string
)。