Вывод типа в 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