“类型”;json";|未定义不满足于;json";在HttpClient中
我正在仔细研究这个方法,重点是这个方法。我准备了以下样本:“类型”;json";|未定义不满足于;json";在HttpClient中,json,angular,typescript,angular-httpclient,Json,Angular,Typescript,Angular Httpclient,我正在仔细研究这个方法,重点是这个方法。我准备了以下样本: const headers: HttpHeaders = new HttpHeaders(); const observe: HttpObserve = null; const params: HttpParams = new HttpParams(); const reportProgress = false; const responseType = "json"; const withCredentials =
const headers: HttpHeaders = new HttpHeaders();
const observe: HttpObserve = null;
const params: HttpParams = new HttpParams();
const reportProgress = false;
const responseType = "json";
const withCredentials = true;
const options = {
headers, observe, params,
reportProgress, responseType, withCredentials
};
this.http.get(url, options)
我得到一个错误,说明如下
没有与此调用匹配的重载。
上一次重载导致以下错误。
类型为“{responseType:string;…}”的参数
不可分配给类型为“{responseType:”json“|未定义;…}”的参数。
属性“responseType”的类型不兼容。
类型“string”不可分配给类型“json”| undefined”。
很明显,报道的问题是什么。然而,我看不出我键入的内容是如何验证所需内容的。如果我键入undefined
作为responseType
的值,编译器会满意。事实上,详细的代码示例(编号7、8和12到15)明确说明了要使用的语法
我的
“json”
怎么不是必需的“json”
?HttpClient方法用于某些选项,而不仅仅是将responseType
声明为通用字符串
,它们提供了它可以采用的特定值。既然选项
对象有一个可接受的值,为什么它不符合类型定义
最初的声明:
const responseType = "json";
const options = { responseType /* etc. */ };
将responseType
定义为字符串文本类型“json”
;它是一个常量
,它只能有一个值。到目前为止,一切顺利。但是,对象声明:
const responseType = "json";
const options = { responseType /* etc. */ };
提供选项
类型{responseType:string},它拓宽了属性的类型。之所以这样做是因为对象是可变的,所以您可以更改值
要解决这个问题,您有几个选项;无特定顺序:
- 内联对象创建:
这不会扩大类型,因为不能将不同的值指定给不包含引用的对象this.http.get(url, { responseType });
- 显式键入中间对象:
const options: { responseType: "json" } = { ... };
- 在对象上使用以下选项:
这一个有点奇怪,因为
的类型仍然是responseType
,就像它最初一样。但是,这会创建一个““json”
context”,其中该类型是非加宽的,因此,const
的结果类型是options
(不是上述的{responseType:“json”}
,但您只能为其指定一个值)readonly
这里是一个操场,显示了
选项的各种选项。因为responseType是以字符串形式键入的,所以错误消息会告诉您这一点。它不是字符串文本类型“json”
。它应该被推断为文本类型,因为-您使用的是什么版本?@jornsharpe我的VSCode在底部说是v3.9.4。当我运行tsc--version时,我得到了一个错误,但很可能是因为它位于错误的目录中。在这件事上我信任VSC。另外,我不完全确定你所说的文字类型是什么意思,所以我会用谷歌搜索它。我认为字符串文字类型和常量字符串是同一概念的不同名称。-“json”
是一个字符串
,但并非所有字符串
都是“json”
@MichaelD preference常量响应类型:“json”=“json”代码>-然后检查实际值(将const foo=“bar”与“baz”
进行比较)。这非常有趣。我还添加了类型转换解决方案:'json'
@MichaelD,这似乎很有效,const responseType=“json”
(或者“json”作为const
来使用答案中的语法),但我不明白为什么我不想添加它,responseType
的类型没有改变,它仍然是“json”
,但是
似乎也会影响对象的创建,元数据在某种程度上与值保持一致。它使选项
键入{responseType:“json”}
,这不是对象上的只读
像常量
,但仍然只能接受一个值。@MichaelD好的,我算出了并添加了它,谢谢!