0

Опциональные свойства, зависящие от других свойств

13

У меня есть следующая проблема с интерфейсом Typescript:

interface Sample {
    key1: boolean;
    key2?: string;
    key3?: number;
};

В данном случае key1 всегда обязателен, key2 всегда опционален, а key3 должен присутствовать только если key1 равно true, и должен отсутствовать, если key1 равно false. Иными словами, наличие ключа зависит от значения другого ключа. Как я могу реализовать это условие в Typescript?

1 ответ(ов)

0

Чтобы добиться такого поведения в React с использованием TypeScript, можно воспользоваться условными типами для определения свойств компонента в зависимости от наличия свойства truncate. Вот пример, который демонстрирует, как это можно реализовать.

Сначала определим интерфейс для общих свойств:

interface CommonProps {
  children: React.ReactNode;

  // ...другие свойства, которые всегда присутствуют
}

Затем создаем условные типы для свойств TruncateProps:

type TruncateProps =
  | { truncate?: false; showExpanded?: never }
  | { truncate: true; showExpanded?: boolean };

Теперь объединим эти типы с общими свойствами:

type Props = CommonProps & TruncateProps;

Теперь мы можем использовать эти свойства в компоненте Text:

const Text = ({ children, showExpanded, truncate }: Props) => {
  // Здесь `truncate` и `showExpanded` будут иметь тип `boolean | undefined`
  
  return (
    <div>
      {truncate && showExpanded ? (
        <div>{children} (развернуто)</div>
      ) : (
        <div>{children}</div>
      )}
    </div>
  );
};

Таким образом, если truncate равно true, то свойство showExpanded будет доступно, и вы сможете задать логику для отображения текста с возможностью развертывания. Если truncate не указано или установлено в false, то showExpanded не будет доступно, что позволит избежать возникновения ошибок.

Теперь вы можете использовать компонент Text в таком виде:

<Text>not truncated</Text>
<Text truncate>truncated</Text>
<Text truncate showExpanded>truncated w/ expand option</Text>

Это гарантирует, что использование пропсов в компоненте будет строго контролироваться TypeScript, что повысит безопасность типов и уменьшит вероятность ошибок.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь