Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

317
Visualizações
Cómo asignar un valor condicional a una clave en función de otra de sus propiedades

Mi problema

Me pregunto cómo puedo asignar un valor a una clave que depende de otra clave dentro de ese mismo objeto. En este caso quiero decir que si el animal tiene dueño NO es alimento pero si no tiene dueño ES alimento. Entonces, en mi ejemplo, el objeto animal debería evaluarse como verdadero y animal2 debería evaluarse como falso, pero no lo hacen.

 > I have tried isFood: animal.owner ? false: true > I have tried isFood: animal.hasOwnProperty("owner") ? false: true > I have tried isFood: "owner" in animal ? false: true > I have tried isFood: this.owner ? false: true
 interface personInterface { name: string, age: number, isMember: boolean }; interface animalInterface<T> { owner?: T, sound: string, species: string, isFood: boolean } let person: personInterface; person = { name: "justin", age: 30, isMember: true } let animal: animalInterface<personInterface>; let animal2: animalInterface<personInterface>; animal = { owner: {...person}, sound: "Woof", species: "Dog", isFood: this.owner ? false: true } animal2 = { sound: "Woof", species: "Dog", isFood: this.owner ? false: true }
about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Para lograrlo, necesita usar uniones discriminadas :

 interface PersonInterface { name: string, age: number, isMember: boolean }; interface AnimalInterfaceBase<T> { owner?: T, sound: string, species: string, isFood: boolean } type WithOwner<T> = { owner: T, sound: string, species: string, isFood: false } type WithoutOwner = { sound: string, species: string, isFood: true } type AnimalInterface<T> = WithOwner<T> | WithoutOwner let person: PersonInterface; person = { name: "justin", age: 30, isMember: true } let animal: AnimalInterface<PersonInterface>; let animal2: AnimalInterface<PersonInterface>; animal = { owner: person, sound: "Woof", species: "Dog", isFood: false } animal2 = { owner: person, // expected error sound: "Woof", species: "Dog", isFood: true }

Patio de juegos

PD Es convencional escribir en mayúsculas los nombres de las interfaces.

about 4 years ago · Juan Pablo Isaza Relatório

0

this puede variar dependiendo de dónde se use, dentro de una función o globalmente. Para hacer referencia al objeto actual y seguir accediendo a la clave como una propiedad, puede usar get accessor como se muestra a continuación. Puedes leer más sobre cómo get accesor aquí .

 animal = { owner: { ...person }, sound: "Woof", species: "Dog", get isFood() { // Here this refers to current object return this.owner ? false : true } } animal2 = { sound: "Woof", species: "Dog", get isFood() { return this.owner ? false : true } } console.log(animal.isFood); console.log(animal2.isFood);
about 4 years ago · Juan Pablo Isaza Relatório

0

En este caso, podría usar tipos de unión etiquetados. Básicamente, crea dos interfaces y las distingue por una propiedad, en su caso isFood :

 interface BaseAnimalInterface { sound: string; species: string; isFood: boolean; } interface AnimalInterface extends BaseAnimalInterface { isFood: true; } interface PetInterface<T = PersonInterface> extends BaseAnimalInterface { owner: T; isFood: false; } type AnimalType = AnimalInterface | PetInterface;

Luego, si verifica esa propiedad en una instrucción if/switch , obtendrá el tipo adecuado:

 function playSound(animal: AnimalType): void { if (animal.isFood) { // Casted automatically to `AnimalInterface` } else { // Casted automatically to `PetInterface` } }

Ejemplo completo.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda