我有一些代码,我想try 删除以下内容的使用:

let result: any;

结果可以是从REST API调用返回的大型JSON. 并将其替换为递归类型别名 所以我有这个:

type Json = string | number | boolean | null | Array<Json> | { [key: string]: Json };

一旦我这样做了,我的代码就会抱怨如下:

if (result.reasonCode != "8700" && result.reasonCode != "8207") {
.
.}

由于未定义原因代码. 于是我试着添加了这个--不确定这是正确还是错误的.这只是我试图绕过最初的错误.我希望不必使用界面.我正在使用TypeScrip V5.

interface JsonArray extends Array<Json> {
  reasonCode: string;
  message: string;
}

然后我将结果更改为:

let result: JsonArray;

now I do not get any compile errors for result.reasonCode.
but I now get another error

当我这样做的时候:

if (result === "error" {
.
.} 

错误在于, This comparison appears to be unintentional because the types 'JsonArray' and 'string' have no overlap

为了解决这个问题,我不得不改成这样:

let result: JsonArray | "error"; 

我无法控制rest API调用返回的内容.

这一切看起来有点杂乱无章,所以寻求一些建议.

推荐答案

您的递归类型别名定义了一个通用的JSON struct ,没有特定的已知字段,因此,当您告诉您字段reasonCode可能不存在于此类型的值中时,TypeScrip是正确的.

例如,如果result === "error"为真(根据您的描述,这是一种可能的情况),则result的类型为string,自然没有reasonCode字段.

如果您的代码首先确保我们处理的值确实不是数字,字符串,布尔值,null或数组,那么TS将能够假设该值是对应于{ [key: string]: Json }的键值对象,这应该允许访问任何具有字符串键的字段.

判断这一点有点棘手,因为数组和空值的typeof也是"object".应该是这样的:

if (result && !Array.isArray(result) && typeof result === 'object')

Typescript相关问答推荐

如何使打包和拆包功能通用?

TypeScript泛型参数抛出错误—?&#"' 39;预期"

如果请求是流,如何等待所有响应块(Axios)

基于平台的重定向,Angular 为16

基于键的值的打字动态类型;种类;

使某些(嵌套)属性成为可选属性

我可以使用TypeScrip从字符串词典/记录中填充强类型的环境对象吗?

推断从其他类型派生的类型

如何将TS泛型用于react-hook-form接口?

专用路由组件不能从挂钩推断类型

->;Boolean类型的键不能分配给类型Never

我可以使用typeof来强制执行某些字符串吗

Rxjs将省略的可观测对象合并到一个数组中

为什么看起来相似的代码在打字时会产生不同的错误?

如何处理可能为空的变量...我知道这不是Null?

使用泛型以自引用方式静态键入记录的键

typescript如何从映射类型推断

我如何键入它,以便具有字符串或数字构造函数的数组可以作为字符串或数字键入s或n

在ts中获取级联子K类型?

如何在Typescript 中定义具有相同类型的两个泛型类型的两个字段?