问题标签 [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.
typescript - 确定泛型方法类型的默认参数
我定义了一个泛型方法,其泛型类型由其中一个参数确定:
现在,我想为参数设置一个默认值,然后 T 将由默认值的类型确定:
但这不会编译,因为它期望“字符串”匹配 T 而不是确定 T 是“字符串”。
一种解决方案是编写:
但是我需要在调用站点明确指定类型:
我考虑的另一个解决方案是编写第二个函数,没有默认参数:
但后来我需要一个不同的名字,这让我很困扰。
有一个更好的方法吗?
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 在操场之外实际使用的语法来解决这个问题的任何想法?
angular - 如何在打字稿的泛型类中创建类型为“T”的新对象?
我有以下服务
编译成功通过,但我在浏览器控制台中出现以下错误
如何创建 T 类型的对象?
typescript - 具有泛型类型的打字稿包装函数
如何在不更改 Typescript 中的泛型类型的情况下包装函数?
typescript - 如何从泛型类访问静态变量?
我有很多带有静态变量的类,如下所示:
用户.ts:
汽车.ts:
我想在某个地方DataSource
像这样调用(见下文):
数据源.ts:
当然,它不会编译,因为我不能简单地使用T.<variable>
. 所以,我的问题是:我怎样才能做到这一点?
typescript - TypeScript:无法解析泛型类装饰器的签名
我不明白为什么 TypeScript 需要明确的泛型类型定义Child2
,Child3
在这种情况下:
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
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”。
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.X
or <T extends Type<???>>(o: T) => typeof o
。
TypeScript 中有没有办法做到这一点?如果是这样,怎么做?
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>
仅使用。这两个提交似乎都没有在现实生活中编译。