Typescript: аргумент Infer function - PullRequest
0 голосов
/ 11 мая 2018

С тех пор, как TS 2.8, мы можем сделать следующее:

type ArgType<F> = F extends (a: infer A) => any ? A : any

const fn: (s: string) => 500

ArgType<(typeof fn> // => string

Давайте предположим следующую ситуацию.

type FunctionCollection = {
  [key: string]: (s: ???) => any
}

const fnCol: FunctionCollection = {
    someFn: (s: string) => 500
}

Вопрос: Есть ли способ заменить ??? (или всю функцию FunctionCollection) на такой тип, что

ArgType<(typeof fnCol)["someFn"]> 'equals' string

(Проблема в том, что, например, если ??? = any, мы получим any)

1 Ответ

0 голосов
/ 11 мая 2018

Поскольку тип аргумента может быть разным для каждого свойства типа, вам потребуется аргумент типа:

type FunctionCollection<T> = {
    [P in keyof T]: (s: T[P]) => any
}

Теперь, чтобы создать такую ​​переменную, вам нужно указать свойства в качестве аргумента типа для FunctionCollection, что меньше идеального:

const fnColNoInference: FunctionCollection<{
    someFn: string;
    otherFn: number;
}> = {
    someFn: (s: string) => 500,
    otherFn: (s: number) => 500
}

Лучшим подходом является использование поведения вывода функций для определения типа константы:

function functionCollection<T>(args: FunctionCollection<T>) {
    return args
}

const fnCol = functionCollection({
    someFn: (s: string) => 500,
    otherFn: (s: number) => 500
})

let d : ArgType<(typeof fnCol)["someFn"]> // is string 
let d2 : ArgType<(typeof fnCol)["otherFn"]> // is number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...