javascript - La propiedad no existe en el tipo de interfaz unión
Tengo un objeto que contiene un arreglo de miembros del equipo, el objeto más pequeño de tipo objeto implementa ya sea interface Member o interface Manager. Los objetos Manager pueden contener otros objetos interface Member. Cada miembro/gerente tiene su propio key: string.
Como puedes ver en el código, estoy intentando implementar una función setProfession(key, profession) que establece una propiedad profession: string para un determinado miembro/gerente basado en su key: string personal.
Hay este error dentro de mi función setProfession:
Property 'members' does not exist on type 'Member | Manager'.
No entiendo el error, porque he puesto una salvaguarda en la línea justo antes de la línea donde ocurre el error. Sin embargo, aún así lanza un error, aunque interface Manager obviamente contiene la propiedad members: Captura de pantalla del error
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;
}
Respuesta #1
Typescript no puede rastrear completamente todos los detalles allí. Puedes ayudarlo asignando el valor probado a una variable:
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;
}
}
Ver el patio de recreo
Esto se vuelve mucho más fácil si usas iteración en lugar de bucles indexados. Entonces obtienes esta variable creada como parte de ese bucle de forma gratuita. Y tu código es más fácil de leer y entender, como un beneficio adicional.
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;
}
}
Ver el patio de recreo
