typescript 结构相同但类型不同的脚本对象,如何合并?

hpcdzsge  于 2023-01-14  发布在  TypeScript
关注(0)|答案(3)|浏览(124)
export interface TEST {
   action: 'action1' | 'action2' | 'action3',
   params: User | BadUser
  }

  interface User {
   name: string | null,
   date: string | null,
   ...
  }

  interface BadUser {
   badName: string | null,
   badDate: string | null,
   ...
  }

如何正确访问someUser.params.name或某些BadUser.params.badName?

mklgxw1f

mklgxw1f1#

您可以使用in operator检查params上是否存在字段:

function something(thing: TEST) {
    if ("name" in thing.params) {
        return thing.params.date;
    } else {
        return thing.params.badDate;
    }
}

Playground

cclgggtu

cclgggtu2#

我不确定您所说的“正确访问属性”是什么意思,所以我假设两种可能的情况
1.您希望确保params的类型为User,以便可以访问params.name,反之亦然创建一个type guard方法来检查哪个接口与对象匹配

const isUser = (obj: User | BadUser): obj is User => 'name' in obj;
const isBadUser = (obj: User | BadUser): obj is BadUser => 'badDate' in obj;

if (isUser(someUser.params))
    someUser.params   // <- User
else someUser.params  // <- BadUser

您可以在 typescript 手册中找到更多关于类型保护的信息。
1.您希望intellisense将这两个定义都添加到对象中,以便接受所有四个属性。在这种情况下,您需要从Union更改为Intersection

export interface TEST {
   action: 'action1' | 'action2' | 'action3',
   params: User & BadUser
}

这样,就有必要同时注意这两种类型。
您可以在旧的打字手册中找到更多关于交集类型的信息。
我希望这些能解决你的问题。

mepcadol

mepcadol3#

let test: TEST = {};

return test.params.name ?? test.params.badName;    
or
return test.params.date ?? test.params.badDate;

相关问题