Как понять тип ... args: any []) => any - PullRequest
0 голосов
/ 06 июня 2018

Я читаю код библиотеки class-validator , и в ней есть следующий метод isInstance:

/**
 * Checks if the value is an instance of the specified object.
 */
isInstance(object: any, targetTypeConstructor: new (...args: any[]) => any) {
    return targetTypeConstructor
        && typeof targetTypeConstructor === "function"
        && object instanceof targetTypeConstructor;
}

Есть мысли о том, как это сделать?понимание типа new (...args: any[]) => any?Это первый раз, когда я вижу этот тип конструкции ...

Ответы [ 4 ]

0 голосов
/ 06 июня 2018

Разбивая его на части:

new
Это ключевое слово в TypeScript указывает, как должен выглядеть конструктор для данного свойства.Хорошее объяснение здесь: https://stackoverflow.com/a/39623422/1678614.

(...args: any[]) => any
Этот синтаксис описывает тип функции (конструктор является функцией).Пока игнорируйте ... часть.

...
- оператор распространения ES6.Это сокращение для перечисления всех элементов массива один за другим.

any[]
означает, что args является массивом, и его элементы могут быть любого типа.

=> any
указывает тип возвращаемого значения функции.В этом случае он позволяет конструктору возвращать любой тип.

0 голосов
/ 06 июня 2018

Означает, что параметр targetTypeConstructor является функцией, которая принимает параметры, и может использоваться в качестве конструктора (вы можете использовать с ключевым словом new и создавать экземпляры) .Вы можете передать простую функцию или класс, которые не являются аннотациями .

. Более подробно вы можете проверить пример в Typescript Playground

0 голосов
/ 06 июня 2018

Давайте уменьшим шрифт до кусочков меньшего размера, которые легче понять, а затем вернемся к полноте.

Сначала давайте отбросим new из нашего ума и сосредоточимся на последнем.часть определения:

(...args: any[]) => any

Теперь давайте забудем об аргументах:

() => any

Надеюсь, это знакомо как функция, которая возвращает тип any.

Далее мы можем добавить обратно в аргументы:

(...args: any[]) => any

...args: any[] использует конструкцию Rest Parameters, которая, по сути, говорит, что может быть любое количество параметров предоставленного типа any.Поскольку существует неизвестное количество any параметров, тип аргумента представляет собой массив any.

Поэтому, надеюсь, теперь имеет смысл, что это функция, которая принимает любое количество аргументов (извведите any) и возвращает тип any.

Наконец, мы можем добавить обратно ключевое слово new, чтобы получить:

new (...args: any[]) => any

Ключевое слово new здесь указывает, что эту функцию можно рассматривать как функцию конструктора класса и вызывать с ключевым словом new.

Это дает нам полное представление о том, что функция является функциейкоторый принимает любое количество аргументов (типа any), которое возвращает тип any и может использоваться в качестве функции конструктора с ключевым словом new .

Когда берется в контекстеAPI, по сути, позволяет передавать любой конструктор класса в функцию.

0 голосов
/ 06 июня 2018
new (...args: any[]) => any

Этот тип определяет функцию, которая принимает любое количество аргументов типа any, возвращает значение any и может быть вызвана с помощью new.

Конструктор является специальнымтип функции, которая вызывает вызов с ключевым словом new во время выполнения, но в TypeScript, который может быть обнаружен статически, поэтому targetTypeConstructor указывает произвольный конструктор в качестве второго параметра для isInstance().

Toс этой целью кажется избыточным проверять

typeof targetTypeConstructor === "function"

, поскольку это уже принудительно выполняется targetTypeConstructor : new (...args: any[]) => any во время компиляции с помощью TypeScript.

Если переданное значение равно null, оно ужепризнается недействительным условием targetTypeConstructor && ..., которое является необходимым во время выполнения для предотвращения object instanceof targetTypeConstructor от выброса TypeError в случае, если targetTypeConstructor действительно null из-за шага 4 в §12.10.4 спецификации ECMAScript :

12.10.4 Семантика времени выполнения: InstanceofOperator ( V , target )

  1. If Type ( target ) не является объектом, выведите TypeError исключение.
  2. Пусть instOfHandler будет?GetMethod ( target , @@ hasInstance).
  3. Если instOfHandler не равен undefined , то

    a,Return ToBoolean (? Call ( instOfHandler , target , « V »)).

  4. If IsCallable ( target) равно false , выдать исключение TypeError .
  5. Return?OrdinaryHasInstance ( target , V ).

NOTE

Шаги 4 и 5 обеспечивают совместимость с предыдущими выпусками ECMAScript, которыене использовал метод @@ hasInstance для определения семантики оператора instanceof .Если объект не определяет или не наследует @@ hasInstance, он использует семантику instanceof по умолчанию.

...