首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >属性在联合接口类型上不存在。

属性在联合接口类型上不存在。
EN

Stack Overflow用户
提问于 2022-07-07 23:12:55
回答 1查看 33关注 0票数 2

我有一个包含团队成员数组的对象,最小的对象类型实现了interface Memberinterface Manager。管理器对象可以包含其他interface Member对象。每个成员/经理都有自己的key: string

正如您从代码中看到的,我正在尝试实现一个函数setProfession(key, profession),它根据某个成员/经理的个人key: string为他们设置一个profession: string属性。

在我的setProfession函数中有一个错误:

代码语言:javascript
复制
Property 'members' does not exist on type 'Member | Manager'.

我不明白这个错误,因为我已经在错误所在的线前设置了一个安全防护装置。尽管interface Manager显然包含members属性:误差印刷机,但它仍然引发错误。

代码语言:javascript
复制
interface Member {
  key: string;
  name: string;
  profession: string;
}

interface Manager {
  key: string;
  name: string;
  profession: string;
  members: Array<Member>
}

interface Team {
  members: Array<Member | Manager>
}

const TEAM: Team = {
  members: [
    {
      key: 'RodneyMcKay1',
      name: 'Rodney McKay',
      profession: 'Scientist'
    }, {
      key: 'JohnShephard1',
      name: 'John Shephard',
      profession: 'Soldier',
      members: [
        {
          key: 'TeylaEmmagan1',
          name: 'Teyla Emmagan',
          profession: 'Soldier'
        }, {
          key: 'RononDex1',
          name: 'Ronon Dex',
          profession: 'Soldier'
        }
      ]
    }
  ]
};

const isManager = (member: Member | Manager): member is Manager => {
  return member.hasOwnProperty('members');
}

const setProfession = (key: string, profession: string): boolean => {
  for (let i = 0; i < TEAM.members.length; i++) {
    if (isManager(TEAM.members[i])) {    // SAFE GUARD 
      for (let j = 0; j < TEAM.members[i].members.length; j++) {    // ERROR
         if (TEAM.members[i].members[j].key === key) {    // ERROR
           TEAM.members[i].members[j].profession = profession;    // ERROR
           return true;
         }
      }
    } else if (TEAM.members[i].key === key) {
      TEAM.members[i].profession = profession;
      return true;
    }
  }

  return false;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-07 23:17:52

打字稿不能很好地追踪所有的训练。您可以通过将测试过的值赋值给一个变量来帮助它:

代码语言:javascript
复制
  for (let i = 0; i < TEAM.members.length; i++) {
    const person = TEAM.members[i]
    
    if (isManager(person)) {
      for (let j = 0; j < person.members.length; j++) {
         if (person.members[j].key === key) {
           person.members[j].profession = profession;
           return true;
         }
      }
    } else if (person.key === key) {
      person.profession = profession;
      return true;
    }
  }

看游乐场

如果使用迭代而不是索引循环,这就容易得多。然后就可以免费创建这个变量,作为循环的一部分。而且您的代码更容易阅读和理解,这是一个额外的好处。

代码语言:javascript
复制
  for (const person of TEAM.members) {
    if (isManager(person)) {
      for (const member of person.members) {
         if (member.key === key) {
           member.profession = profession;
           return true;
         }
      }
    } else if (person.key === key) {
      person.profession = profession;
      return true;
    }
  }

看游乐场

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72905123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档