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] : "";
};
}