TypeScript:如何在不指定模板参数的情况下使用模板化类型?

标签 typescript templates generics types typescript-generics

最小工作示例:

type FuncType<T> = (a: T) => T;

let f1: FuncType<T>; // does not compile
let f2: <T>(a: T) => T; // compiles

问题是 FuncType 不是我定义的,而是来自一个库。它也比上面的例子复杂得多。我想使用从库导出的模板化类型,而不必自己重新声明它(就像我在注释 f2 时所做的那样)。

这可能吗?如果没有,你知道为什么不吗?

感谢您的任何意见,我找不到有关此主题的任何内容

最佳答案

您不能将变量键入为未实例化的泛型类型。

原因<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

Playground Link

如果您想表示 FuncType 的任何实例化你最好的选择是 FuncType<any> 。但您将不得不忍受相关的不安全因素。 ( unknownever 在这里不起作用,因为 FuncTypeT 中是不变的,它们分别适用于 type FuncType<T> = () => Ttype FuncType<T> = (a: T) => void )

关于TypeScript:如何在不指定模板参数的情况下使用模板化类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67018511/

相关文章:

TypeScript Compiler API 在转换过程中丢失格式

angular - TS2304 : cannot find name require and process

c++ - 显式函数特化的默认模板参数

c++ - 将类模板声明为友元

Java 持久性标准;将 Expression<Timestamp> 转换为 Expression<Long>?

java - Eclipse 泛型问题 - 解决方法?

angularjs - 如何从 jasmine 导入 'createSpyObj' 以进行用 Typescript 编写的测试?

c++ - 根据 value_type 调用适当的构造函数 : integer or float

c# - 通用列表上的 is-operator

javascript - 如何键入嵌套对象的子属性?