Typescript 此接口语法是否定义函数签名
我看到一些代码如下:Typescript 此接口语法是否定义函数签名,typescript,Typescript,我看到一些代码如下: export interface SomeInterface<T> { <R>(paths: string[]): Observable<R>; <R>(Fn: (state: T) => R): Observable<R>; } 导出接口SomeInterface{ (路径:字符串[]):可观察; (Fn:(状态:T)=>R):可观察; } 我搜索了TS文档,但似乎没有找到好的解释。因此
export interface SomeInterface<T> {
<R>(paths: string[]): Observable<R>;
<R>(Fn: (state: T) => R): Observable<R>;
}
导出接口SomeInterface{
(路径:字符串[]):可观察;
(Fn:(状态:T)=>R):可观察;
}
我搜索了TS文档,但似乎没有找到好的解释。因此,我想问:
我认为您对代码意图的理解是正确的,因为它试图为一组函数定义一个接口,这些函数产生
可观察的。然而,虽然接口是有效的,但我认为任何函数都不能满足该接口的要求,因为它必须同时满足两个函数签名。对于一个具体的示例,请尝试将以下内容粘贴到
要实现这一点,您需要将SomeInterface
拆分为两个独立的通用函数接口。调用签名中类型参数的使用是有文档记录的
该接口描述了一个。它需要实现两个签名。你可以这样做:
function f<R>(paths: string[]): Observable<R>; // not really possible
function f<R>(func: (state: number) => R): Observable<R>;
function f<R>(something: string[] | ((state: number) => R)): Observable<R> {
if (Array.isArray(something)) {
return { someField: null as any as R }; // see? can't do it!
}
return { someField: something(2) };
}
const someInterfaceNumber: SomeInterface<number> = f;
函数f(路径:字符串[]):可观察;//不太可能
函数f(func:(状态:number)=>R):可观测;
函数f(something:string[]|((state:number)=>R)):可观察{
if(Array.isArray(某物)){
返回{someField:null作为任意R};//看到了吗?不能这样做!
}
返回{someField:something(2)};
}
常量SomeInterfaceEnumber:SomeInterface=f;
这很好。希望有帮助
*好的,你实际上不能这样做,但那只是因为第一个签名说它是一个通用函数,它接受一个string[]
参数,并为调用方想要的任何R
输出一个可观察的
。。。这是不可能做到的。您没有任何类型为R
的对象可返回。所以你可以把它伪装成空的(null作为任意的R
),但我会担心任何试图使用该接口的人。它只是一个重载函数。您当然可以实现它。我认为Michael的回答更准确,这种接口不能用作函数类型变量的类型注释。编译时,ts会向您发送错误消息。但是它对我非常有帮助,您为出现在函数签名前面的类型参数提供了文档链接。我在上面向您展示了如何创建接口类型的值。这是一个重载函数的签名,@MichaelWu说它不可能是正确的。他所表现出来的只是他没有实施,并不是说它无法实施。
Types of parameters 'paths' and 'func' are incompatible.
Type '(state: string) => any' is not assignable to type 'string[]'.
Property 'push' is missing in type '(state: string) => any'.
function f<R>(paths: string[]): Observable<R>; // not really possible
function f<R>(func: (state: number) => R): Observable<R>;
function f<R>(something: string[] | ((state: number) => R)): Observable<R> {
if (Array.isArray(something)) {
return { someField: null as any as R }; // see? can't do it!
}
return { someField: something(2) };
}
const someInterfaceNumber: SomeInterface<number> = f;