@dmitry-toster

Как задать определенные ключи объекту?

Есть парочка типов:
type TFruit = 'apple' | 'banana'
type TFruitProps = 'color' | 'size'

Как сделать такую структуру валидной?
const food = {
    apple: {
        color: 'red'
    }
};

т.е свойство объекта food = любое значение типа TFruit
значение этого свойства = объект с ключом типа TFruitProps
Я это пытаюсь сделать через Record
type TFood = {
    [key in TFruitProps]: string
}

const food:Record<TFruit, TFood> = {
    apple: {
        color: 'red'
    }
}

Однако, TS ругается на недостающий ключ banana, хотя я указал его через разделитель |. Как сделать его необязательным?
Playground
  • Вопрос задан
  • 93 просмотра
Решения вопроса 2
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
type TFood = Partial<Record<TFruit, Partial<Record<TFruitProps, string>>>>;
Ответ написан
profesor08
@profesor08
Придумай другой способ организации своих данных. Потому что после получения ответа на этот вопрос, ты прибежишь со следующим в виде "А как обрабатывать такое г****"

Ответ на вопрос в следующем коде.
type TFruit = 'apple' | 'banana'
type TFruitProps = 'color' | 'size'

type Food = {
  [key in TFruit]?: {
    [key in TFruitProps]?: string;
  };
}

const redApple: Food = {
    apple: {
      color: "red"
    }
};

const bigApple: Food = {
    apple: {
      size: "big",
    }
};

const redBigApple: Food = {
    apple: {
      size: "big",
      color: "red"
    }
};

const redBanana: Food = {
    banana: {
      color: "red"
    }
};

const bigBanana: Food = {
    banana: {
      size: "big",
    }
};

const redBigBanana: Food = {
    banana: {
      size: "big",
      color: "red"
    }
};

const redBigGomunkul: Food = {
    apple: {
      size: "big",
      color: "red"
    },
    
    banana: {
      size: "big",
      color: "red"
    }
}

const wtf: Food = {}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы