问题标签 [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 回答
536 浏览

typescript - 确定泛型方法类型的默认参数

我定义了一个泛型方法,其泛型类型由其中一个参数确定:

现在,我想为参数设置一个默认值,然后 T 将由默认值的类型确定:

但这不会编译,因为它期望“字符串”匹配 T 而不是确定 T 是“字符串”。

一种解决方案是编写:

但是我需要在调用站点明确指定类型:

我考虑的另一个解决方案是编写第二个函数,没有默认参数:

但后来我需要一个不同的名字,这让我很困扰。

有一个更好的方法吗?

0 投票
1 回答
812 浏览

typescript - 实现接口函数 - 声称不正确地实现接口

目标

我最好尝试在项目中强制输入,以便实现 Animal 的任何人都必须提供此函数并确保该函数只能将 Woof 或 Meow 作为唯一参数,并且必须仅返回 Woof 或喵。

初步尝试

这是一些与我在 VSCode 中获得的代码(使用 TypeScript 2.4.1)类似(名称除外)的示例代码:

如果我将它放在 TypeScript playground中,它会生成我期望的 JavaScript 而不会出错。

但是,在 VSCode 中,我在 Dog 和 Cat 类下都有一条红色波浪线,鼠标悬停读取以下所有内容:

“狗”类错误地实现了“动物”接口。

属性“doSomething”的类型不兼容。

类型 '(sound: Woof) => Woof' 不能分配给类型 '(input: T) => T'。

参数 'sound' 和 'sound' 的类型不兼容。

类型“T”不可分配给类型“Woof”。

类型'Woof | Meow' 不能分配给类型 'Woof'。

'Meow' 类型不能分配给 'Woof' 类型。

“喵”类型中缺少属性“a”

每个错误都是嵌套的,因此很难在此处准确显示格式,但这似乎表明我在扩展泛型时不能只指定 Woof 或 Meow 类型,因为私有属性未在这两种类型中实现(看起来类似于此处的另一个问题)。尽管在文档中没有看到任何表明这是非法的(同样,在操场上,这似乎没有问题)。但是,与那个问题不同的是,我不希望泛型扩展这两种类型,而是限制为其中一种。

阅读关于交集类型的帖子中的描述,它显示“联合类型 A | B 表示一个属于 A 类型或 B 类型的实体,而交集类型 A 和 B 表示一个既属于 A 类型又属于 B 类型的实体”。读到这里,我肯定想要一个联合类型,但这就是我上面所说的,而且似乎没有。

类型在备用类下的波浪线中翻转,但消息是相同的。

当我在输出中实际使用“tsc”构建项目时,我也会收到此错误。

替代尝试 - 用每个实现的接口替换类型

我还尝试实现以下内容,希望它可以消除私有属性在 Woof 和 Meow 类之间匹配的奇怪需求(以防在指定每个类时出现意外情况):

对于每个类,我都得到与以前完全相同的错误。

半工作版

现在,如果我完全消除泛型并仅使用上述替代方案中的接口,它解决了部分目标,因为我可以将参数和结果限制为实现接口的类,但这并不完全理想,因为它没有'不要阻止另一个开发人员传入一个接口实现并尝试返回另一个。

我更喜欢使用泛型并将 T 限制为一种实现的类型安全。关于如何使用泛型和 Typescript 在操场之外实际使用的语法来解决这个问题的任何想法?

0 投票
3 回答
13619 浏览

angular - 如何在打字稿的泛型类中创建类型为“T”的新对象?

我有以下服务

编译成功通过,但我在浏览器控制台中出现以下错误

如何创建 T 类型的对象?

0 投票
4 回答
5082 浏览

typescript - 具有泛型类型的打字稿包装函数

如何在不更改 Typescript 中的泛型类型的情况下包装函数?

0 投票
1 回答
2466 浏览

typescript - 如何从泛型类访问静态变量?

我有很多带有静态变量的类,如下所示:

用户.ts:

汽车.ts:

我想在某个地方DataSource像这样调用(见下文):

数据源.ts:

当然,它不会编译,因为我不能简单地使用T.<variable>. 所以,我的问题是:我怎样才能做到这一点?

操场

0 投票
2 回答
487 浏览

typescript - TypeScript:无法解析泛型类装饰器的签名

我不明白为什么 TypeScript 需要明确的泛型类型定义Child2Child3在这种情况下:

0 投票
1 回答
1048 浏览

typescript - Dynamic interfaces with generics

I am simplifying the question here .

Another generic interface

But this wont work as it gives error

Cannot find T

If I try to generate it by keeping it inside a function

It says

A computed property name in an interface must directly refer to built-in symbol.

My desired output is to have dynamic interface such that . State<Tenant> should behave

0 投票
3 回答
1593 浏览

typescript - 什么是R(观察者:观察者) => 订阅 | 功能 | 空白

Angularfire2 项目有一个正在进行的分支,添加了一个存储功能。两个新文件包括一个 Observable 类和一个 Factory 函数。

可观察类

工厂功能

简而言之,我得到的错误是:

类型“R”不可分配给类型“UploadTaskSnapshot”。

这个答案有助于强化我认为我已经知道<T>的 Typescript 和泛型,但什么是<R>?

(完整的错误信息)

'(obs: Observer) => void' 类型的参数不能分配给 '((observer: Observer) => void | Function | Subscription) | 类型的参数 不明确的'。类型 '(obs: Observer) => void' 不可分配给类型 '(observer: Observer) => void | 功能 | 订阅'。参数 'obs' 和 'observer' 的类型不兼容。类型“观察者”不可分配给类型“观察者”。类型“R”不可分配给类型“UploadTaskSnapshot”。

0 投票
1 回答
779 浏览

typescript - TypeScript 中泛型类型的子类型推断

我想要一个函数,它接受一些对象并返回它的x属性。该对象需要限制为泛型类型Type<X>,我希望返回值的类型是属性的类型x

要将输入限制为Type<X>我需要使用T extends Type<X>但我必须将其设置X为某些类型值T extends Type<string>,例如不能使用Type<number>或丢弃属性T extends Type<any>的类型信息。x

我希望做类似的事情<T extends Type<any>>(o: T) => T.Xor <T extends Type<???>>(o: T) => typeof o

TypeScript 中有没有办法做到这一点?如果是这样,怎么做?

0 投票
1 回答
1970 浏览

typescript - TypeScript 泛型:如果 Promise 拒绝和解析类型不同怎么办?

处理错误并使用 Promises 的简单通用的 Angular2+ 数据服务:

在这个类中,get方法返回一个 Promise,它用数组解析,用类型DataType[]拒绝。Error

编译此代码,我收到此错误:

输入“错误 | DataType[]' 不可分配给类型 'DataType'。类型“错误”不可分配给类型“数据类型”。

我正在使用 TypeScript 2.4.2 版。我确信这在 TypeScript 升级后开始发生,这使得类型检查更加严格。

我想知道如何在最新的 TypeScript 中处理不同类型的拒绝。这样做有不同的做法吗?

更新:我找到了相应的错误报告,尚未解决https://github.com/Microsoft/TypeScript/issues/7588

更新

我创建了一个 repo 来展示这个问题,有两个提交。第一次提交使用<TypeResolve | TypeReject>方法,第二次<TypeResolved>仅使用。这两个提交似乎都没有在现实生活中编译。