我有一个通用的
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
可以是任何类型的对象
几天来我一直在努力解决这个问题,欢迎任何帮助!