Home > OS >  Infer generic awaited type from Promise argument
Infer generic awaited type from Promise argument

Time:09-01

I have a generic CacheBuilder factory witch takes a GetValue function in argument and returns an instance of Cache

type GetValue<T> = (() => T) | (() => Promise<T>)

type CacheBuilder = <T> (getValue: GetValue<T>, options?: BuildCacheOptions<T>) => Cache<T>

One thing to note is the getValue function can be both sync or async.

I'd like to be able to let Typescript infer T from getValue, but to always return the Awaited type.

Such as :

import { buildCache } from './cache'
// (buildCache is a CacheBuilder)

const getMyVal = () => Promise.resolve('foo')

// Inferred
const cache = buildCache(getMyVal)

My trouble is cache is inferred as Cache<Promise<string>> while I'd like it to be a Cache<string>

CodePudding user response:

Instead of storing the type T in GetValue<T>, we can store GetValue directly like this, then get the return type of it and "await" it, but with types.

type CacheBuilder = <G extends GetValue<any>> (getValue: G, options?: BuildCacheOptions<Awaited<ReturnType<G>>>) => MyCache<Awaited<ReturnType<G>>>

Playground

Awaited type

CodePudding user response:

You can just use Awaited on the return type for Cache

type GetValue<T> = (() => T)
type CacheBuilder = <T> (getValue: GetValue<T>, options?: BuildCacheOptions<T>) => Cache<Awaited<T>>
  • Related