TypeScript 中的类型推断在特殊用例中无法按预期工作
Type inference in TypeScript not working as desired in a special use case
TypeScript 中的类型推断非常棒。
不过,我有一个案例,我认为 TypeScript 可以推断出相应的类型,但事实并非如此。现在我问自己,在那个特定的用例中,这对于 TypeScript 来说是否是不可能的,或者我是否做错了什么(或者至少必须改变一些东西才能让它工作)。
实际上,在下面的示例(一个非常简单和微小的商店实现)中,我想摆脱那个明确的 type Store = ...
声明,并想用 [= 替换那个 createStore<Store>(...)
14=] 因为我认为该类型应该由下面的 return 值推断出来。这有可能吗?
function createStore<T>(init: (self: T) => T): T {
// just ignore that this is not implemented here
}
type Store = {
count: number,
increment(): void
}
// I want to get rid of <Store> in the following line - any ideas?
const store = createStore<Store>(self => {
return {
count: 0,
increment() {
self.count++
}
}
})
console.log(store.count) // prints out 0
store.increment()
console.log(store.count) // prints out 1
如果工作演示可能有帮助,请参阅:
https://stackblitz.com/edit/typescript-huvdpc
[编辑] 仅供参考,在这个用例中使用 Flow 类型推断似乎工作正常:
/* @flow */
function createStore<T>(init: (self: T) => T): T {
const ret: T = (({}: any): T)
Object.assign(ret, init(ret))
return ret
}
const store = createStore(self => {
return {
count: 0,
increment() {
self.count++
}
}
})
console.log(store.count) // prints out 0
store.increment()
console.log(store.count) // prints out 1
[编辑:几个小时后]
从下面的评论来看,似乎无法按照我在上面的示例中希望的方式实现类型推断。
在类型推断按预期工作的不同实现中,这基本上是相同的事情:
Typescript 不支持类型推断(至少在当前版本 3.3.x 中)如果函数具有 "argument"-"return value"-循环类型上面的例子。
不过,Flow 支持这种类型推断。
TypeScript 中的类型推断非常棒。 不过,我有一个案例,我认为 TypeScript 可以推断出相应的类型,但事实并非如此。现在我问自己,在那个特定的用例中,这对于 TypeScript 来说是否是不可能的,或者我是否做错了什么(或者至少必须改变一些东西才能让它工作)。
实际上,在下面的示例(一个非常简单和微小的商店实现)中,我想摆脱那个明确的 type Store = ...
声明,并想用 [= 替换那个 createStore<Store>(...)
14=] 因为我认为该类型应该由下面的 return 值推断出来。这有可能吗?
function createStore<T>(init: (self: T) => T): T {
// just ignore that this is not implemented here
}
type Store = {
count: number,
increment(): void
}
// I want to get rid of <Store> in the following line - any ideas?
const store = createStore<Store>(self => {
return {
count: 0,
increment() {
self.count++
}
}
})
console.log(store.count) // prints out 0
store.increment()
console.log(store.count) // prints out 1
如果工作演示可能有帮助,请参阅: https://stackblitz.com/edit/typescript-huvdpc
[编辑] 仅供参考,在这个用例中使用 Flow 类型推断似乎工作正常:
/* @flow */
function createStore<T>(init: (self: T) => T): T {
const ret: T = (({}: any): T)
Object.assign(ret, init(ret))
return ret
}
const store = createStore(self => {
return {
count: 0,
increment() {
self.count++
}
}
})
console.log(store.count) // prints out 0
store.increment()
console.log(store.count) // prints out 1
[编辑:几个小时后]
从下面的评论来看,似乎无法按照我在上面的示例中希望的方式实现类型推断。
在类型推断按预期工作的不同实现中,这基本上是相同的事情:
Typescript 不支持类型推断(至少在当前版本 3.3.x 中)如果函数具有 "argument"-"return value"-循环类型上面的例子。
不过,Flow 支持这种类型推断。