данных.
                  
                  
                  Формируется он по такой логике:
                  
                  
                  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 : ... А заранее формировать результирующие типы невозможно из-за того, что в сложных типах могут использоваться любые другие из представленных, в тч другие сложные, но какие именно мы не знаем.
Обсуждают сегодня