【发布时间】:2017-11-30 18:10:13
【问题描述】:
我正在尝试将以下 Flow sn-p 转换为 Typescript:
type Handler<Data> = (data: Data) => void
type Foo = { foo: string }
type AnyRequest = (path: '/foo', handler: Handler<Foo>) => void
type FooRequest = (path: string, handler: Handler<any>) => void
type RouterRequest = AnyRequest | FooRequest
function router(request: RouterRequest) {
request('/foo', (data) => {
// here data should be of type Foo
})
request('/bar', (data) => {
// here data should be of type any
})
}
这里的流可以通过使用path参数正确推断data的类型。见running snippet
Typescript 中的相同代码无法推断data 的类型
将此代码粘贴到playground 给我这个错误
无法调用类型缺少调用签名的表达式。类型“RouterRequest”没有兼容的调用签名。
有什么方法可以在 Typescript 中实现类似的功能吗?
【问题讨论】:
-
请详细说明
The same code in Typescript fail -
我的意思是 Typescript 无法推断数据的类型。 Playground 中的实际错误是:“无法调用类型缺少调用签名的表达式。类型 'RouterRequest' 没有兼容的调用签名。”
-
嗯。不知道它应该如何工作。
request的类型在我看来是无法推断出来的,因为预先不知道是AnyRequest还是FooRequest被传入。我希望我能更好地理解 TS 类型推断。 -
换句话说,我认为,在 TypeScript 中,您需要明确检查所提供参数的类型并在其上进行分支
-
是的,或者按照@jcalz 的建议去做!
标签: typescript flowtype