首页 > 解决方案 > 如何从函数泛型获取分配返回类型

问题描述

class Dyn {
    static flatten (a: any) {

    }
    static cliff <G extends any[], B, A extends (...a: G) => B, Z>(a: A, b: ( ) => Z) {
        return (...p: G) => { 
            const runA = a(...p)
            return {
                _: runA,
                ...b()
            }
        }
    }
}

type User = { name: string, id: number }
type Kitten = { name: string, id: number }
const getUserById = (id: number): User => ({ name: 'thomas', id })
const getKittenById = (id: number): Kitten => ({ name: 'thomas', id})


const x = Dyn.flatten({
    user: Dyn.cliff(getUserById, () => ({
        kitten: getKittenById
    }))
})

操场

我试图理解为什么当我将鼠标悬停在Dyn.cliff.

(method) Dyn.cliff<any[], unknown, (id: number) => User, {
    kitten: (id: number) => Kitten;
}>(a: (id: number) => User, b: () => {
    kitten: (id: number) => Kitten;
}): (...p: any[]) => {
    _: unknown;
} & {
    kitten: (id: number) => Kitten;
}

我怎么能有这样的_: unknown;我们_: User

标签: typescript

解决方案


正如 jcalz 在评论中提到的那样,删除额外的类型参数可以提供更好的推理。在这种情况下,您需要删除额外的类型参数并使用Parameters<T>ReturnType<T>助手来获取所需的类型。游乐场

class Dyn {
    static flatten (a: any) {

    }
    static cliff<A extends (...a: any[]) => any, Z>(a: A, b: ( ) => Z) {
        return (...p: Parameters<A>) => {
            // Without the explicit type declaration here runA is determined to be `any`
            // before the generic is resolved.
            const runA: ReturnType<A> = a(...p)
            return {
                _: runA,
                ...b()
            }
        }
    }
}

type User = { name: string, id: number }
type Kitten = { name: string, id: number }
const getUserById = (id: number): User => ({ name: 'thomas', id })
const getKittenById = (id: number): Kitten => ({ name: 'thomas', id})


const x = Dyn.flatten({
    user: Dyn.cliff(getUserById, () => ({
        kitten: getKittenById
    }))
})

推荐阅读