Как создать тип, который должен содержать каждый ключ схемы, но может содержать и другие ключи?Javascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Как создать тип, который должен содержать каждый ключ схемы, но может содержать и другие ключи?

Сообщение Anonymous »

Я пытаюсь создать компонент React для динамического создания, управления и рендеринга форм с использованием zod и React-Hook-Form. По сути, существует реестр входных компонентов и обрабатываемых им типов zod, который используется для создания объекта конфигурации, в котором пользователь указывает схему zod, а затем полей конфигурации, которые автоматически предлагают совместимые компоненты из реестра.Все это отлично работает, но я столкнулся с проблемой при попытке добавить пользователю возможность указывать компоненты, не являющиеся полем, для рендеринга в соответствии с компонентами поля, например какой-нибудь виджет для визуализации поля. , прямо над определенным полем. Это тип конфигурации:

Код: Выделить всё

export type ItemsConfig =
// A) Required field items for keys in the schema
{
[K in keyof Z["shape"] & string]: {
type: "field item";
config: FieldItemConfig;
};
} & {
// B) Optional non-field items for any other string keys
[K in Exclude]?: {
type: "non-field item";
config: NonFieldElement;
};
};

export type FormStageConfig<
R extends FormItemRegistry,
Z extends ZodObject,
> = {
title?: string;
description?: string;
schema: Z;
items: ItemsConfig;
};
FieldItemConfig имеет тип поля, который выбирает из компонентов реестра, применимых к типу поля zod, и поле реквизитов для дополнительных реквизитов. NonFieldElement определяет реквизит любого типа и любой реагирующий компонент.
Это работает так, как я хочу, при определении конфигурации, пока не будут определены все элементы поля, после чего TypeScript внезапно меняет свое мнение и решает, что тип первого определенного элемента поля на самом деле должен быть элементом, не являющимся полем.
Также в компоненте динамического рендеринга TypeScript сворачивает тип полей элементов, чтобы быть только FieldItemConfigs. В этом коде

Код: Выделить всё

for (const itemKey of itemKeys) {
const item = items[itemKey];
if (item.type === "field item") {
// Get props and field type from config
const { type, props } = item.config;

// Get Field type component from registry
const { component: Component } = registry[type];
return ;
// Construct non-field component
} else {
const { component: Component, props } = item.config;

return ;
}
}
TypeScript жалуется на компонент в блоке else, говоря, что «компонент не существует по типу (тип для FieldItemConfig)».
Я думаю, что изменение типа элементов на массив, вероятно, сработает, но тогда я не думаю, что смогу обеспечить соблюдение ограничения, согласно которому массив содержит все поля в схеме. Я попробовал несколько других определений для ItemsConfig, и кажется, что при использовании [K в строке] вместо Exclude для необязательных компонентов, не являющихся полем, логика рендеринга работает, и TypeScript может определить, что поля, в которых тип != элемент поля, являются элементы, не являющиеся полями, но та же проблема возникает в определении конфигурации, где, как только все поля определены, он внезапно утверждает, что вместо этого они должны быть элементами, не являющимися полями.
Я также пробовал проверить это с помощью гораздо более простые типы для полей и не полей configs, который дает те же результаты, поэтому я относительно уверен, что здесь нет какой-то проблемы с базовыми типами. Неужели просто невозможно указать объект таким образом? Если нет, есть ли способ с помощью TypeScript заставить массив содержать определенный набор объектов, соответствующих ключам схемы?

Подробнее здесь: https://stackoverflow.com/questions/793 ... also-conta
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»