TypeScript中的类型推断在特殊用例中无法正常工作

问题描述 投票:1回答:1

TypeScript中的类型推断是惊人的。不过我有一个案例,我认为TypeScript可以推断出相应的类型,但事实并非如此。现在我问自己,对于特定用例中的TypeScript是不可能的,还是我做错了什么(或者至少需要改变一些东西以使其工作)。

实际上,在下面的例子中(一个非常简单和微小的商店实现)我想摆脱那个明确的type Store = ...声明,并希望用createStore<Store>(...)替换那个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

如果工作演示可能有所帮助,请参阅:https://stackblitz.com/edit/typescript-huvdpc


[编辑]只是fyi,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

[编辑:几小时后]

从下面的评论来看,似乎不可能按照我在上面的例子中的方式实现类型推断。

在类型推断按需工作的不同实现中,这基本上是相同的:

https://stackblitz.com/edit/typescript-7olxbc

typescript types type-inference
1个回答
0
投票

如果函数具有“参数” - “返回值” - 如上例中的圆形性,则Typescript不支持(至少不在当前版本3.3.x中)支持类型推断。

然而,Flow正在支持这种类型的推理。

© www.soinside.com 2019 - 2024. All rights reserved.