Вывод типа в TypeScript не работает должным образом в особом случае использования - PullRequest
0 голосов
/ 25 февраля 2019

Вывод типа в TypeScript удивителен.Тем не менее у меня есть случай, когда я думал, что TypeScript может вывести соответствующий тип, но это не так.Теперь я спрашиваю себя, не является ли это невозможным для TypeScript в данном конкретном случае использования или в том случае, если я сделал что-то не так (или, по крайней мере, должен был что-то изменить, чтобы заставить его работать).

Собственно, в следующем примере (aочень простая и крошечная реализация хранилища) Я хотел бы избавиться от этого явного объявления 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


[Редактировать] Просто к вашему сведению, с выводом типа потока, кажется, работает нормальнов этом случае:

/* @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

1 Ответ

0 голосов
/ 28 февраля 2019

Typescript не поддерживает (по крайней мере, в текущей версии 3.3.x) вывод типа, если функции имеют вид «аргумент» - «возвращаемое значение» - округлость, как в примере выше.

Тем не менее, Flow поддерживает этот тип вывода типа.

...