Почему я могу назначить `Function` для` Interface` в Typescript? - PullRequest
0 голосов
/ 11 февраля 2019

Я читаю Справочник машинописного текста - Общие понятия , и есть фрагмент кода следующего содержания:

interface GenericIdentityFn {
    <T>(arg: T): T;
}

function identity<T>(arg: T): T {
    return arg;
}

let myIdentity: GenericIdentityFn = identity;

Я хотел бы знать, почему я могу назначить identity(что является Function) для переменной с типом GenericIdentityFn (которая является Interface)?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Когда интерфейс следует этому шаблону:

interface Callable {
  (): any
}

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

interface GenericCallable<T> {
  (): T
}
interface Newable {
  new (): any
}
interface GenericNewable<T> {
  new (): T
}

, где те, у которых ключевое слово new, являются newable , что означает, что они вызываются с использованием new ключевое слово (например, классы).

Вы также можете иметь интерфейс, который может быть вызываемым и обновляемым одновременно.Объект Date, встроенный в стандартную библиотеку, является одним из них:

interface DateConstructor {
    new(): Date;
    (): string;
}

Короче говоря, интерфейсы также могут описывать функции, и GenericIdentityFn является примером такого интерфейса.

0 голосов
/ 11 февраля 2019

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

Интерфейсы способны описывать широкий диапазон форм, которые могут принимать объекты JavaScript.В дополнение к описанию объекта со свойствами интерфейсы также могут описывать типы функций.

См. Typescript doc об этой функции.

В вашем случаеidentity имеет ту же сигнатуру, что и тип, определенный в GenericIdentityFn, поскольку интерфейс определяет вызываемую сигнатуру, которая принимает аргумент типа T и возвращает T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...