Typescript 工厂函数类型推断

问题描述 投票:0回答:0

我有一个通用的

createFetcher
工厂函数,它接受一个
validationStrategy
并返回一个
fetcher
函数。
fetcher
函数需要一个
schema
fetcher
返回的数据类型是根据
validationStrategy
schema

的类型来确定的

这是我到目前为止的代码:

已编辑

const createFetcher = <
   Key extends keyof GenSchema,
   GenSchema extends Record<string, any> = Record<string, any>,
>(
   validationStrategy: (schema: GenSchema, data: any) => ReturnType<GenSchema[Key]>,
) => {
   const fetcher = async <Schema extends GenSchema>(
      schema: Schema,
   ): Promise<ReturnType<Schema[Key]>> => {
      const data = await (await fetch('/')).json()
      return await validationStrategy(schema, data)
   }

   return fetcher
}

type MySchema<T = any> = { parse: (data: T) => T }

async function main() {
   const schema: MySchema<number[]> = { parse: () => [1, 2, 3] }
   
   const fetcher = createFetcher<'parse', MySchema>((schema, data) => schema.parse(data))
   const data = await fetcher(schema)
   //    ^?   number[]  ->  OK
}

我想获得相同的结果而不必将通用的

Key
参数传递给工厂:

type MySchema<T = any> = { parse: (data: T) => T }

async function main(){
   const schema: MySchema<number[]> = { parse: () => [1, 2, 3] }

   const fetcher = createFetcher<MySchema>((schema, data) => 
   schema.parse(data))
   const data = await fetcher(schema)
   //    ^? any   -> Not ok, should be number[]
}

在哪里

validationStrategy
应该像
type ValidationStrategy<Schema=any> = (schema: Schema, data: any) => any

schema
可以是任何类型的对象

几天来我一直在努力解决这个问题,欢迎任何帮助!

typescript generics types typescript-generics inference
© www.soinside.com 2019 - 2024. All rights reserved.