Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
“类型”;json";|未定义不满足于;json";在HttpClient中_Json_Angular_Typescript_Angular Httpclient - Fatal编程技术网

“类型”;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”
    ,就像它最初一样。但是,这会创建一个“
    const
    context”,其中该类型是非加宽的,因此,
    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好的,我算出了并添加了它,谢谢!