问题标签 [typescript-generics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
51173 浏览

typescript - 您可以为 TypeScript 泛型指定多个类型约束吗

我有一个像这个例子一样的通用接口,它有一个类型约束:

是否可以指定多个类型约束而不仅仅是一个?

0 投票
2 回答
1111 浏览

typescript - TypeScript:制作通用接口A的方法仅当 T 属于特定类型时才可用

请看这段代码:

我希望foo与该B<Function>类型兼容,但我得到了error TS2339: Property 'method2' does not exist on type 'A<Function>'. 我可以B以某种方式重写接口以使其工作吗?

实际上,我正在尝试修复 lodash 的类型_.memoize

更新。基本上,我的问题是:我是否可以编写这样一个通用方法,A<T>只有当T它是其他类型的子类型时它才可用U

0 投票
1 回答
505 浏览

typescript - TypeScript:强制泛型 T 和 U

我正在用这个 API 编写一个库:

与标准 JavaScript reduce一样,该实现使用tArrayas memoif nomemo提供的第一项。

铸造 ( <U>) 合理地给出,Neither Type 'T' nor Type 'U' is assignable to the other.

什么是定义 API 的合理方式?

0 投票
1 回答
1506 浏览

typescript - 传递给通用函数包装器(如 _.debounce)的函数的类型推断

在 TypeScript 中,如果将函数表达式作为参数传递,则可以完美推断其参数的类型:

这对于事件处理程序和其他回调非常方便。但是,如果函数表达式被包装在通用包装函数的调用中,该函数将函数作为参数并返回具有相同签名(返回值除外)的函数,例如_.debounceLodash,则不会发生推理。

TS游乐场

由于foo希望它的参数是(a: string) => void,编译器可以尝试找到这样的类型,因为Tdebounce<T>会返回(a: string) => void。但它不会尝试这样做。

我错过了什么吗?我应该debounce以其他方式编写类型注释吗?是设计使然吗?GitHub上有关于这个案例的问题吗?

UPDATE-2017:现在可以使用了!TS 2.5。

0 投票
1 回答
5883 浏览

typescript - 使用泛型类型参数作为参数

我正在尝试创建一个通用函数,它使用any类型参数调用另一个函数。这是我尝试过的:

问题是这不能编译。我收到Cannot find name 'T'错误。

我试过get(typeof T)但 typeof T 是 string "function"

我能做些什么?

为了澄清: get() 方法接受类型。例如,您可以像这样使用它:

0 投票
2 回答
239 浏览

javascript - 类型检查和泛型

假设我有一个界面:

然后我在几个类中实现:

为什么 TypeScript 允许比较矩形和圆形?

它不应该警告我我为 circle 的equals方法提供了不兼容的类型吗?

0 投票
1 回答
146 浏览

typescript - 如何使泛型类型约束可实例化

我有这两个代码片段,我该如何更改它们,以便 MemberModel 可以作为泛型类型传入并保持可实例化,以便我可以将 follow 方法提取到它自己的导出函数中?

我如何使 follow 和 IFollowable 通用,以便我传入的任何类型仍然像 MemberModel 现在一样是新的?

0 投票
1 回答
502 浏览

typescript - 为什么类型参数不被推断为联合类型?

这段代码

导致此错误:

无法从用法中推断类型参数“U”的类型参数。考虑明确指定类型参数。类型参数候选“数字”不是有效的类型参数,因为它不是候选“字符串”的超类型。函数 fn(array: T[], 谓词: ((arg: T) => U)[]): [T, U]

为什么不能U简单地推断出string | number这里的类型?

0 投票
1 回答
87 浏览

typescript - 将通用对象存储在类的私有属性中

我正在编写一个 Angular 2 应用程序,并且有一个组件可以动态地将其他组件呈现到视图中,如https://blog.thecodecampus.de/angular-2-dynamically-render-components/中所述

该过程效果很好,但与其创建组件并立即从构造函数中销毁它,我宁愿将该逻辑放在类中的另一个函数中,该函数根据输入准确确定预期将哪个组件写入页面。存在切换显示哪些子组件的功能,因此我需要能够存储已解析的组件对象,以便稍后在其上调用 destroy() ,这导致我们手头的问题。

我想将此对象存储在私有属性中的类中,但我不知道如何键入它。以下是 .d.ts 文件必须描述最初实例化对象的 createComponent 函数的内容:

现在一切都很好,但是当我传入需要解析的组件时,它有一个通用类型的 C 已解析,但我想将其指定为我可能传入的任何潜在组件。我不想要只是将我的财产指定为“任何”,因为那样的话,沿途的破坏将不会生效,例如

现在,我确定我可以对数组进行类型保护并说它可以是 AppleComponent | 类型。香蕉组件 | CherryComponent 等,但我希望它更灵活,并且每次修改时都不必维护这些警卫,例如

我能想到的唯一另一种方法是为这些组件创建一个空接口,让每个组件实现它,然后让它组成类型,但是我只是将类型保护的维护切换到必须记住将接口应用于我将来添加的每个组件。

是否有任何其他方法可以让我指定一个对象是泛型类型,而不必事先指定该泛型类型是该类的什么?

谢谢!

0 投票
1 回答
197 浏览

typescript - 通用打字稿界面

我已经看到一些例子让我觉得它可能会起作用,但我无法让以下工作。下面,C泛型代表一个类类型,I泛型代表一个接口类型。但是,return new SomeClass()抱怨:Type SomeClass is not assignable to type I

这应该像我想的那样工作吗?我错过了什么吗?或者这只是不支持。我正在使用 Typescript 2.10 版运行 VS Code。