Минимальный рабочий пример:
type FuncType<T> = (a: T) => T;
let f1: FuncType<T>; // does not compile
let f2: <T>(a: T) => T; // compiles
Проблема в том, что FuncType не определяется мной, а берется из библиотеки. Это также намного сложнее, чем в приведенном выше примере. Я хотел бы использовать шаблонный тип, экспортированный из библиотеки, вместо того, чтобы заново объявлять его самому (как я это делаю, когда аннотирую f2).
Это вообще возможно? Если нет, то почему бы и нет?
Спасибо за любой вклад, я не могу найти ничего по этой теме
Это не компилируется с использованием TS 4.2.3 - какую версию компилятора вы используете @ RobertoZvjerković?






Вы не можете ввести переменную как не созданный универсальный тип.
<T>(a: T) => T работает потому, что это универсальная функция. FuncType<T>, как определено, является универсальным типом, который является функцией. Разница в том, что для универсальной функции параметр типа определяется на сайте вызова (для каждого вызова), в то время как для универсального типа тип определяется при объявлении переменной и не зависит от последующих вызовов.
type FuncType<T> = (a: T) => T;
declare let f1: FuncType<number>;
f1(1) // ok, T is number
f1("1") // not ok, T is still number
declare let f2: <T>(a: T) => T;
f2(1) // ok, T is number
f2("1") // also ok, T is now string
Если вы хотите представить какой-либо экземпляр FuncType, лучше всего будет FuncType<any>. Но вам придется жить с связанной с этим небезопасностью. (unknow и never здесь не будут работать, поскольку FuncType инвариантен в T, они будут работать для type FuncType<T> = () => T и type FuncType<T> = (a: T) => void соответственно)
declare let f1: FuncType<T>;