Skip to content

Commit 011ff89

Browse files
committed
refactor(evaluate): more consistent type inference
1 parent 98fc60f commit 011ff89

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

src/function/evaluate/evaluate.spec.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { evaluate } from './evaluate.js'
33
import { sleep } from '../../async/index.js'
44
import { asyncForAll, forAll, unknown } from '../../random/index.js'
55

6-
import { it } from 'vitest'
6+
import { it, expectTypeOf } from 'vitest'
77

88
it('constant', () => {
99
forAll(unknown(), (x) => evaluate(x) === x)
@@ -23,3 +23,20 @@ it('async fn', async () => {
2323
)
2424
})
2525
})
26+
27+
it('types', () => {
28+
expectTypeOf(evaluate(1)).toEqualTypeOf<1>()
29+
expectTypeOf(evaluate('foo')).toEqualTypeOf<'foo'>()
30+
expectTypeOf(evaluate(true)).toEqualTypeOf<true>()
31+
expectTypeOf(evaluate(null)).toEqualTypeOf<null>()
32+
33+
expectTypeOf(evaluate(() => 1)).toEqualTypeOf<number>()
34+
expectTypeOf(evaluate(() => 'foo')).toEqualTypeOf<string>()
35+
expectTypeOf(evaluate(() => true)).toEqualTypeOf<boolean>()
36+
expectTypeOf(evaluate(() => null)).toEqualTypeOf<null>()
37+
38+
expectTypeOf(evaluate((..._: any[]) => 1)).toEqualTypeOf<number>()
39+
expectTypeOf(evaluate((..._: any[]) => 'foo')).toEqualTypeOf<string>()
40+
expectTypeOf(evaluate((..._: any[]) => true)).toEqualTypeOf<boolean>()
41+
expectTypeOf(evaluate((..._: any[]) => null)).toEqualTypeOf<null>()
42+
})

src/function/evaluate/evaluate.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
import { isFunction } from '../../guard/is-function/index.js'
2-
import type { ConstExpr } from '../../type/function/index.js'
3-
4-
export type Evaluated<T extends ConstExpr> = T extends () => infer V ? V : T
52

63
/**
74
* Takes a value or a function that returns a value, and returns the value.
@@ -23,6 +20,6 @@ export type Evaluated<T extends ConstExpr> = T extends () => infer V ? V : T
2320
*
2421
* @group Functions
2522
*/
26-
export function evaluate<T extends ConstExpr>(maybeEvaluate: T): Evaluated<T> {
27-
return (isFunction(maybeEvaluate) ? maybeEvaluate() : maybeEvaluate) as Evaluated<T>
23+
export function evaluate<const T>(maybeEvaluate: T | (() => T)): T {
24+
return isFunction(maybeEvaluate) ? maybeEvaluate() : maybeEvaluate
2825
}

0 commit comments

Comments
 (0)