Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 基于接口实现类方法_Typescript - Fatal编程技术网

Typescript 基于接口实现类方法

Typescript 基于接口实现类方法,typescript,Typescript,鉴于第三方库类型定义中的接口: 接口IHttpResponse{ 资料:T; 状态:编号; 标题:IHttpHeadersGetter; config:IRequestConfig; statusText:字符串; xhrStatus:'完成'|'错误'|'超时'|'中止'; } IHttpHeadersGetter如下所示: 接口IHttpHeadersGetter{ ():{[name:string]:string;}; (headerName:string):string; } 如何在

鉴于第三方库类型定义中的
接口

接口IHttpResponse{
资料:T;
状态:编号;
标题:IHttpHeadersGetter;
config:IRequestConfig;
statusText:字符串;
xhrStatus:'完成'|'错误'|'超时'|'中止';
}
IHttpHeadersGetter
如下所示:

接口IHttpHeadersGetter{
():{[name:string]:string;};
(headerName:string):string;
}
如何在
实现的
中实现
标题

这就是我的
实现的样子,但正如大家所看到的,并非所有来自
IHttpHeadersGetter
的成员都实现了:

类MockResponse实现IHTTPRESSONSE{
资料:T;
状态:编号;
标题(标题名称:字符串):字符串{
//返回一些标题值
};
config:IRequestConfig;
statusText:字符串;
xhrStatus:“完成”|“错误”|“超时”|“中止”;
}
因此,
tsc
抱怨:

error TS2345: Argument of type 'MockResponse<any>' is not assignable to parameter of type 'IHttpResponse<any>'.
  Types of property 'headers' are incompatible.
    Type '(headerName: string) => string' is not assignable to type 'IHttpHeadersGetter'.
错误TS2345:类型为“MockResponse”的参数不能分配给类型为“IHTTPRESSONSE”的参数。
属性“headers”的类型不兼容。
类型“(headerName:string)=>string”不可分配给类型“IHttpHeadersGetter”。

如何正确实现
标题?

IHttpHeadersGetter的类型有两个调用签名。这意味着它是一个应用程序,它的任何实现都需要兼容。最简单的方法是使实现本身成为一个重载函数,具有与
IHttpHeadersGetter
相同的调用签名

例如(不包括其他属性):

类MockResponse实现IHTTPRESSONSE{
//电话签名
headers():{[name:string]:string};//调用签名1
headers(headerName:string):string;//调用签名2
//实施
标题(标题名称?:字符串):字符串{[名称:字符串]:字符串}{
常量标题:{[name:string]:string}={
someHeader:“你好”,
其他标题:“你”
}
返回(标题名称的类型!=“字符串”)?标题:
(标题中的标题名称)?标题[标题名称]:“”;
};
}
这应该为您编译,并根据需要工作。希望有帮助;祝你好运


IHttpHeadersGetter的类型有两个呼叫签名。这意味着它是一个应用程序,它的任何实现都需要兼容。最简单的方法是使实现本身成为一个重载函数,具有与
IHttpHeadersGetter
相同的调用签名

例如(不包括其他属性):

类MockResponse实现IHTTPRESSONSE{
//电话签名
headers():{[name:string]:string};//调用签名1
headers(headerName:string):string;//调用签名2
//实施
标题(标题名称?:字符串):字符串{[名称:字符串]:字符串}{
常量标题:{[name:string]:string}={
someHeader:“你好”,
其他标题:“你”
}
返回(标题名称的类型!=“字符串”)?标题:
(标题中的标题名称)?标题[标题名称]:“”;
};
}
这应该为您编译,并根据需要工作。希望有帮助;祝你好运


关键部分是在类上定义
headers
函数的两个重载,然后使用两个重载组合的类型签名实现实际方法

最后一节课应该是:

类MockResponse实现IHTTPRESSONSE{
资料:T;
状态:编号;
//首先指定两个重载
headers():{[name:string]:string;};
标题(标题名称:字符串):字符串;
//然后实现结合两个签名的方法
标题(标题名称?:字符串):字符串{[名称:字符串]:字符串;}{
//返回一些标题值
if(headerName的类型=='string'){
返回headerName;
}
返回{some:'object'};
};
config:IRequestConfig;
statusText:字符串;
xhrStatus:“完成”|“错误”|“超时”|“中止”;
}

请参见。

关键部分是在类上定义
headers
函数的两个重载,然后使用两个重载组合的类型签名实现实际方法

最后一节课应该是:

类MockResponse实现IHTTPRESSONSE{
资料:T;
状态:编号;
//首先指定两个重载
headers():{[name:string]:string;};
标题(标题名称:字符串):字符串;
//然后实现结合两个签名的方法
标题(标题名称?:字符串):字符串{[名称:字符串]:字符串;}{
//返回一些标题值
if(headerName的类型=='string'){
返回headerName;
}
返回{some:'object'};
};
config:IRequestConfig;
statusText:字符串;
xhrStatus:“完成”|“错误”|“超时”|“中止”;
}

请继续观看。

谢谢,现在可以了。我已经尝试了
//实现
部分签名,但我不知道需要
//调用签名
部分。有关于这方面的官方文件吗?这可能是最接近于“官方”文件的东西,它在那里提到了这一点,但是它没有非常明确地说明实现签名与调用签名的不同。谢谢,现在可以了。我已经尝试了
//实现
部分签名,但我不知道需要
//调用签名
部分。有关于这方面的官方文件吗?可能是关于这方面的最接近“官方”文件的东西,它在那里提到了这一点,但它没有非常明确地说明实现签名与调用si不同
class MockResponse<T> implements IHttpResponse<T> {

    // CALL SIGNATURES
    headers(): { [name: string]: string }; // call signature 1
    headers(headerName: string): string; // call signature 2

    // IMPLEMENTATION
    headers(headerName?: string): string | { [name: string]: string } {
        const theHeaders: { [name: string]: string } = {
            someHeader: "hello",
            otherHeader: "you"
        }
        return (typeof headerName !== "string") ? theHeaders :
            (headerName in theHeaders) ? theHeaders[headerName] : "";
    };
}