@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
  • Вопрос задан
  • 78 просмотров
Решения вопроса 2
bingo347
@bingo347
Ткнуть в доку лучше готового к копипасте ответа
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 = {}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Так будет работать, но не очень красиво:

type TFruit = 'apple' | 'banana'
type TFruitProps = 'color' | 'size';
type KEYS = {
    'prop1': null, 'prop2':null , 'prop3': null;
}


type ThreeStringProps = Record<keyof KEYS, TFruitProps>;

let a:ThreeStringProps = {
    prop1: "color",
    prop2: "color",
    prop3: "color"
}


Решение получше:

type TFruit = 'apple' | 'banana'
type TFruitProps = 'color' | 'size';
type Keys = "prop1" | "prop2" | "prop3";

type ThreeStringProps = Partial<Record<Keys, TFruitProps>>;

let a:ThreeStringProps = {
    prop1: "color",
    prop2: "color",
    prop3: "color"
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы