Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript中的类型推断在特殊用例中无法按预期工作_Typescript_Types_Type Inference - Fatal编程技术网

TypeScript中的类型推断在特殊用例中无法按预期工作

TypeScript中的类型推断在特殊用例中无法按预期工作,typescript,types,type-inference,Typescript,Types,Type Inference,TypeScript中的类型推断是惊人的。 然而,我有一个案例,我认为TypeScript可以推断出相应的类型,但它不能。现在我问自己,在那个特定的用例中,TypeScript是否不可能这样做,或者我是否做错了什么(或者至少必须改变一些东西才能使它工作) 事实上,在下面的示例中(一个非常简单且很小的存储实现),我想去掉显式的type store=…声明,并想用createStore(…)替换createStore(…),因为我认为应该通过下面的返回值来推断该类型。这有可能吗 function c

TypeScript中的类型推断是惊人的。 然而,我有一个案例,我认为TypeScript可以推断出相应的类型,但它不能。现在我问自己,在那个特定的用例中,TypeScript是否不可能这样做,或者我是否做错了什么(或者至少必须改变一些东西才能使它工作)


事实上,在下面的示例中(一个非常简单且很小的存储实现),我想去掉显式的
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
上移动类型注释,但仅此而已。