Skip to content

Instantly share code, notes, and snippets.

@bloadvenro
Last active December 30, 2019 23:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bloadvenro/cac3fc95ee622bf722443bbc07639de9 to your computer and use it in GitHub Desktop.
Save bloadvenro/cac3fc95ee622bf722443bbc07639de9 to your computer and use it in GitHub Desktop.
type Tuple<T = unknown> = [T] | T[]
type Tail<A extends Tuple> =
((...args: A) => any) extends ((h: any, ...t: infer T) => any) ? T : never
type HandleVoidAnyUnknown<Target, Fallback> = [void] extends [Target /* void/any/unknown */]
? Fallback
: Target
type StrictestFromTwo<L, R> =
[L] extends [R]
? [R] extends [L]
? L // L = R
: L // R > L
: [R] extends [L]
? R // L > R
: never // L != R
type v = void
type s = string
type b = boolean
type n = number
type sn = s | n
type sb = s | b
type nb = n | b
type snb = s | n | b
declare const strictestTarget: unique symbol
type FindStrictest<T extends Tuple, U = T[0]> = (
T['length'] extends 0
? {
[strictestTarget]: U
}
: {
[strictestTarget]:
FindStrictest<
Tail<T>,
StrictestFromTwo<
HandleVoidAnyUnknown<U, T[0]>,
HandleVoidAnyUnknown<T[0], U>
>
>
}
) extends { [strictestTarget]: infer Result } ? HandleVoidAnyUnknown<Result, any> : never
type Result01 = FindStrictest<[s]> // s
type Result02 = FindStrictest<[s, n]> // never
type Result03 = FindStrictest<[n, s]> // never
type Result04 = FindStrictest<[s, sn]> // s
type Result05 = FindStrictest<[sn, s]> // s
type Result06 = FindStrictest<[s, sn, snb]> // s
type Result07 = FindStrictest<[snb, sn, s]> // s
type Result08 = FindStrictest<[b, snb, sn, s]> // never
type Result09 = FindStrictest<[snb, sn, s, b]> // never
type Result10 = FindStrictest<[v]> // any
type Result11 = FindStrictest<[v, s]> // s
type Result12 = FindStrictest<[s, v]> // s
type Result13 = FindStrictest<[s, sn, snb, v]> // s
type Result14 = FindStrictest<[v, snb, sn, s]> // s
type Result15 = FindStrictest<[v, b, snb, sn, s]> // never
type Result16 = FindStrictest<[snb, sn, s, b, v]> // never
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment