TypeScript中的类型推断在特殊用例中无法按预期工作
TypeScript中的类型推断是惊人的。 然而,我有一个案例,我认为TypeScript可以推断出相应的类型,但它不能。现在我问自己,在那个特定的用例中,TypeScript是否不可能这样做,或者我是否做错了什么(或者至少必须改变一些东西才能使它工作)TypeScript中的类型推断在特殊用例中无法按预期工作,typescript,types,type-inference,Typescript,Types,Type Inference,TypeScript中的类型推断是惊人的。 然而,我有一个案例,我认为TypeScript可以推断出相应的类型,但它不能。现在我问自己,在那个特定的用例中,TypeScript是否不可能这样做,或者我是否做错了什么(或者至少必须改变一些东西才能使它工作) 事实上,在下面的示例中(一个非常简单且很小的存储实现),我想去掉显式的type store=…声明,并想用createStore(…)替换createStore(…),因为我认为应该通过下面的返回值来推断该类型。这有可能吗 function c
事实上,在下面的示例中(一个非常简单且很小的存储实现),我想去掉显式的
type store=…
声明,并想用createStore(…)
替换createStore(…)
,因为我认为应该通过下面的返回值来推断该类型。这有可能吗
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
函数createStore(init:(self:T)=>T:T{
//忽略这里没有实现这一点
}
类型存储={
计数:数字,
增量():void
}
//我想在下面的一行中摆脱——有什么想法吗?
const store=createStore(self=>{
返回{
计数:0,
增量(){
自我计数++
}
}
})
console.log(store.count)//打印出0
store.increment()
console.log(store.count)//打印出1
如果工作演示可能有所帮助,请参阅:
[编辑]仅供参考,在本用例中,使用流类型推断似乎可以很好地工作:
/* @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
/*@flow*/
函数createStore(init:(self:T)=>T:T{
常量ret:T=(({}:any):T)
赋值(ret,init(ret))
回程网
}
const store=createStore(self=>{
返回{
计数:0,
增量(){
自我计数++
}
}
})
console.log(store.count)//打印出0
store.increment()
console.log(store.count)//打印出1
[编辑:几个小时后] 从下面的评论来看,似乎不可能以我在上面示例中希望的方式实现类型推断 在不同的实现中,类型推断按预期工作时,基本上是相同的: Typescript不支持(至少在当前版本3.3.x中不支持)类型推断,如果函数具有“参数”-“返回值”-循环类型,如上例所示 然而,Flow支持这种类型的推断。Typescript不支持类型推断(至少在当前版本3.3.x中不支持),如果函数具有“参数”-“返回值”-循环的类型,如上例所示
然而,Flow支持这种类型的推断。“我想去掉这种显式的”――如果删除显式的
Store
类型,那么就不可能键入self
:什么能保证它有count
属性?不可能,只要继续传递Store
类型参数,这里看起来很好。非常感谢虫族和努尔博拉皮斯巴耶夫的回答。这意味着我必须以某种方式重构那些东西。我在上面的摘要中添加了一个新实现的链接,该实现支持所需的类型推断:您可以在const-store:store
上移动类型注释,但仅此而已。“我想去掉这个显式的”---如果删除显式的Store
类型,则不可能键入self
:什么能保证它具有count
属性?不可能,只需继续传递Store
类型参数,在这里似乎完全可以。非常感谢zerkms和Nurbollypysbayev的回答。这意味着我必须以某种方式重构那些东西。我在上面的总结中添加了一个新实现的链接,该实现支持所需的类型推断:您可以在const store:store
上移动类型注释,但仅此而已。