typescript - 如何从函数泛型获取分配返回类型
问题描述
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
?
解决方案
正如 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
}))
})
推荐阅读
- c# - 可执行文件可以作为 blob 触发的 Azure 函数的一部分运行吗?
- python-3.x - MeCab 解析不正确
- java - 如何将 ArrayList 传递给构造函数?
- java - Spring MVC 和 Spring Security 配置的问题
- docker - Docker 服务容器在特定时间间隔后自动重启
- sql - 同一列上的多个外键约束是“ORed”还是“ANDed”
- java - 从回调函数将对象从 android ViewModel 返回到片段
- scala - 高级连接两个数据框 spark scala
- excel - VBA问题:点击另一个页面后无法获取html元素
- python - * 之后的 Add() 参数必须是可迭代的,而不是 int Pygame