Почему ключевое слово infer необходимо в Typescript? - PullRequest
3 голосов
/ 05 февраля 2020

Почему люди Typescript создали ключевое слово infer? Согласно документам , это пример того, как вы будете его использовать:

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;

Я не понимаю, зачем это нужно. Почему это не может быть просто:

type ReturnType<T> = T extends (...args: any[]) => R ? R : any;

Почему это не работает? Зачем нужно ключевое слово infer

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

Рассмотрим следующий код:

interface Example {
    foo: string
}

type GenericExample<T> = T extends Examlep ? 'foo' : 'bar';

Этот код должен привести к ошибке компиляции, поскольку Examlep написано неправильно; нет типа с именем Examlep, и, очевидно, программист намеревался написать здесь Example.

Теперь представьте, что ключевое слово infer не требуется в предложении extends условного типа. Тогда приведенный выше код не даст ошибку компиляции; он увидел бы, что не существует типа с именем Examlep, определите, какой это тип, а затем (поскольку Examlep не имеет ограничений) заметьте, что T действительно расширяет Examlep для выведенного типа.

В этом случае GenericExample<T> будет всегда быть 'foo' независимо от значения T, и не будет ошибки компиляции, чтобы сообщить программисту об ошибке. Это было бы неправильно для компилятора, почти всегда.

0 голосов
/ 05 февраля 2020

Другая интерпретация:

При infer компилятор гарантирует, что вы явно объявили все переменные типа, которые вы хотите использовать:

  • on левая часть объявления типа - T в ReturnType<T> = ...
  • в условии extends условного типа - R в infer R

Использование необъявленных переменных параметров типа приведет к ошибке компиляции. Без infer компилятор не мог бы знать, действительно ли вы хотите ввести другую переменную типа (скажем, Foo) для вывода или если Foo - просто опечатка.

...