问题标签 [generic-constraints]

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 回答
3540 浏览

generics - TypeScript“扩展”了通用约束

extends在 TypeScript 中使用约束,如下所示:

p: T = new Animal()包含一个错误:

“动物”类型不能分配给“T”类型。

构造函数动物():动物

为什么,我该怎么做才能使用Animal, 代替Animal子类型?

资源

0 投票
1 回答
83 浏览

generics - 具有通用约束的类型扩展不会引发错误,也不会执行预期的操作

考虑以下使用 F# 4.0、.NET 4.6 的代码片段:

我希望类型扩展type X<'T when 'T :> string> with得到尊重(在这种情况下,这意味着错误,因为string是密封的,或者限制'T为 be string),或者引发语法错误。

更重要的是,我也可以使用以下语法,这将是正常类型定义中的语法错误(没有with):

我的猜测是,扩展上的约束被简单地忽略了。这是设计使然吗?或者它应该工作,如果是这样,如何?

当我尝试使用类型扩展并想知道我是否可以创建一组仅适用于特定具体类型或进一步受限的具体类型的特定方法时,我想到了这一切(这也可以通过继承来完成,我知道)。

0 投票
1 回答
84 浏览

swift - 如何为通用函数过滤或有多个选项?

我有一个接收值的函数,然后我将其发送到 NSUserDefaults 以存储在其属性列表中。

如何设置通用约束,以便该值只能是属性列表接受的可能类型之一?

我在想类似的事情:

这当然行不通。

0 投票
2 回答
797 浏览

c# - 泛型类型相互引用

我编写了简单的解析器,并希望实现接下来的两个接口:

它有下一个目的:ITokenizer是一个不可变的类,用于通过标记分割字符串。我们可以调用Advance方法并获取Result:下一个标记和下一个标记器。所以,我想在类中存储令牌和分词器,Result并为此添加编译时约束。

现在我在构造这两个接口时遇到了编译时错误。

我认为下一个类可以实现具有所有约束的接口:

谁能解释什么是错的?也许为什么这是不可能的或者如何使这段代码正确?

PS 对于我的任务,我可以简单地使用IResult<TValue, TToken>没有任何约束的接口,但是我可以在不失去约束的情况下实现它吗?

编译器错误:

0 投票
3 回答
3451 浏览

c# - 如何约束泛型方法的嵌套泛型类型

我正在尝试创建一个基于给定泛型类型从数据库返回数据的方法。

接口:(此定义编译)

一个可能的具体实现:(这个定义编译)

尝试基于接口编写通用方法:(此定义不编译)

错误:

像这样使用:


问题:

为什么这会为接口编译,而不是为方法编译?

我希望两者都能工作或都失败。我假设编译器可以从给定的 TOrderPosition 类型推断出 TOrder 和 TArticle 的类型,该类型定义了文章和订单的具体类型。

我想知道为什么会发生这种情况以及是否以及如何解决问题而无需明确指定所有类型。

0 投票
1 回答
905 浏览

c# - Struct and string generic constraint on class level

Hi is there any workaround on creating a class that has both struct and string as a generic constraint?

My goal is to save myself from the hassle of creating duplicate methods with the same structure but the difference is, the other one accepts a string and the other one accepts struct (value types).

0 投票
2 回答
7797 浏览

generics - TypeScript - 如何将索引签名表示为泛型类型

TypeScript 中的索引签名是这样定义的:

字典

大批

这些可以包装成一些简单的、可重用的类型:

现在我想将它们包装成一个类型。我试过这个:

由于以下错误,这无法编译:

索引签名参数必须是“字符串”或“数字”类型。

这不可能吗?

到底是为了什么?

因为

看起来比

0 投票
2 回答
47 浏览

c# - 具有基于静态成员的类型约束的泛型

我正在尝试使用带有似乎不受支持的约束的泛型,我想知道是否有一个干净的解决方法。

我最初尝试的问题在于接口中不能有静态成员,因此,不能使用接口来约束基于静态成员的泛型声明中的类型。

考虑这个例子:

假设您在通用上下文中工作,但您希望确保 的实例T能够将自己序列化为流(可以是文件、字节列表),并且T可以从流中反序列化 的实例。

在编写的情况下,这很容易,因为可以假设您已经有一个实例可以使用(尽管您将无法序列化null):

但是,在阅读的情况下,你会遇到一个问题:

这似乎可行,但它对如何实例化反序列化的对象做出了假设。也许您想返回一个现有实例而不是创建一个新实例?它还需要new()约束,这可能是不可取的。

毕竟,当您在特定实例的上下文之外工作时,改为在静态上下文中工作是有意义的。所以你可以试试这个:

或者,为了避免拳击:

不幸的是,两者都无法编译,因为您不能在接口中声明静态成员。但是,如果编译器允许我这样做,那将是理想的解决方案,因为它不对您如何处理实例化做出任何假设,而是将责任交给接口实现者。

我找到了一个适用于结构的不错的解决方案:

实现者IFoo调用静态方法的地方。当然,由于在这种情况下default(T)返回,这种方法在引用类型的情况下会失败null。usingreturn new T().Foo();也可以,但这需要再次进行约束,并丢弃不必要地创建垃圾new()的实例。T

我考虑过以某种方式使用反射作为一种解决方法,但我想知道是否有人提出了他们自己的解决方法来解决他们想要分享的这个限制。

0 投票
1 回答
961 浏览

c# - 带有约束的 C# 继承泛型类

所以,我有一个界面:

我有一堂课:

但这会导致语法错误,我想要的是强制 someVariable 衍生

所以我可以这样做:

你能告诉我,如何解决这个问题吗?

这是实际的代码:

0 投票
1 回答
223 浏览

c# - 将集合限制为具有相同类型的派生对象的通用约束

我想限制 Collection 只有使用泛型的相同类型的类。

我想必须InvoiceLine.TransactionLines 同时包含相同类型的TransactionLines 而不是PermTransactionLine一起TempTransactionLineTransactionLine必须是抽象的 - 不想直接创建对象。

我正在尝试添加new()约束但不起作用它说:

TransactionLine 必须具有公共无参数构造函数。

然后我使用 InvoiceLine 将其添加到发票中 - 最初我将所有类型的交易行放在一起作为计费运行的一部分,然后我将为特定交易类型创建发票。

任何想法,我怎么能做到这一点?