данных.
Формируется он по такой логике:
type SchemaResultType<S extends Schema> =
S extends ScalarSchema1 ? type1 :
S extends ScalarSchema2 ? type2 :
S extends ComplexSchema3 ? SchemaResultType<someComplexHandler3(S)> :
S extends ScalarSchema4 ? type4 :
S extends ComplexSchema5 ? SchemaResultType<someComplexHandler5(S)> :
...
При использовании в некоторых местах возникает ошибка
Type instantiation is excessively deep and possibly infinite. ts(2589)
(Насколько понимаю, в тех, где Schema заранее неизвестна, а передаётся аргументом).
Возможное решение - проверка типа на any или unknown
Например
type SchemaResultType<S extends Schema> =
S extends any ? any :
S extends ScalarSchema1 ? type1 :
...
Но именно такая проверка не работает и всегда возвращается any (unknown).
Скажите, как исправить?
Любой тип extends any
И как же сделать нормальную проверку?
> is excessively deep В этом причина. Что если хранить возвращаемый тип в самой схеме, или, чтобы не смешивать сущности, в декларации задать связь схем и возвращаемых типов? type Scalar1 = { schema: ScalarSchema1, returnType: type1 }; type Scalar2 = { schema: ScalarSchema2, returnType: type2 }; type Complex3 = { schema: ComplexSchema3, returnType: SchemaResultType<someComplexHandler3(S)> }; type Scalar4 = { schema: ScalarSchema4, returnType: type4 }; type Complex5 = { schema: ComplexSchema5, returnType: SchemaResultType<someComplexHandler5(S)> }; type SchemaResultType<S extends Schema> = S['returnType'];
Проблема уже решена Нужно просто было сделать нормальную проверку на any в SchemaResultType. Так работает правильно: type SchemaResultType<S extends Schema> = 0 extends (1 & S) ? unknown : S extends ScalarSchema1 ? type1 : ... А заранее формировать результирующие типы невозможно из-за того, что в сложных типах могут использоваться любые другие из представленных, в тч другие сложные, но какие именно мы не знаем.
Обсуждают сегодня