Как динамически извлечь возвращаемый тип TypeScript
const isNull = (v:any) : v is null => v === null;
const isString = (v:any) : v is string => typeof v === 'string';
const or = <T extends Function,K extends Function>(fn1:T, fn2:K) => (first: any): first is ReturnType<T> | first is ReturnType<K> => (fn1(first) || fn2(first))
Реализация
const conditon = or(isNull, isString);
condition(v)
Как из first is ReturnType<T> | first is ReturnType<K>
получить не тип которые возвращают ф-ции а тип который задан v is null
чтобы при передачи значения в описании ф-ции было first is string | null
Ответы (2 шт):
Автор решения: Ram
→ Ссылка
я нашел такой ответ
const or = <T extends Function,K extends Function>(fn1:T, fn2:K) =>
<T>(first: any): first is T =>
(fn1(first) || fn2(first))
condition = (v:any): v is null|string => or(isNull, isString)(v)
condition(v)
Автор решения: qwabra
→ Ссылка
чтобы при передачи значения в описании ф-ции было
first is string | null
смотри t4.
Реализация самих функций отсутствует - за рамками вопроса.
type $is<T> = (q: any) => q is T
// type tt = ReturnType<$is<string>> // type tt = boolean // : (
t2: {
type $valid = $is<number | string>
const valid: $valid = null as any
TEST: {
const q = null as any
if (valid(q)) {
const res = q //const res: string | number
} else {
const res = q // const res: any
}
}
}
t4: {
type $or = <T extends $is<any>[]>(...f: T) => T[number]
const or: $or = null as any
TEST: {
class User { }
const isUser = (q => q instanceof User) as $is<User>
const isString = (q => 'string' === typeof q) as $is<string>
const conditon = or(isUser, isString)
const q = null as any
if (conditon(q)) {
const res = q // const res: string | User
}
}
}