Код: Выделить всё
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;
};
Это работает так, как я хочу, при определении конфигурации, пока не будут определены все элементы поля, после чего 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 ;
}
}
Я думаю, что изменение типа элементов на массив, вероятно, сработает, но тогда я не думаю, что смогу обеспечить соблюдение ограничения, согласно которому массив содержит все поля в схеме. Я попробовал несколько других определений для ItemsConfig, и кажется, что при использовании [K в строке] вместо Exclude для необязательных компонентов, не являющихся полем, логика рендеринга работает, и TypeScript может определить, что поля, в которых тип != элемент поля, являются элементы, не являющиеся полями, но та же проблема возникает в определении конфигурации, где, как только все поля определены, он внезапно утверждает, что вместо этого они должны быть элементами, не являющимися полями.
Я также пробовал проверить это с помощью гораздо более простые типы для полей и не полей configs, который дает те же результаты, поэтому я относительно уверен, что здесь нет какой-то проблемы с базовыми типами. Неужели просто невозможно указать объект таким образом? Если нет, есть ли способ с помощью TypeScript заставить массив содержать определенный набор объектов, соответствующих ключам схемы?
Подробнее здесь: https://stackoverflow.com/questions/793 ... also-conta