问题标签 [structural-typing]

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 投票
1 回答
82 浏览

typescript - Typescript:如何使用结构子类型和继承

考虑以下 Typescript 类:

由于 Typescript 的结构子类型系统,这意味着即使我们将 String255 类分配给 String255Required 属性,下面的构造函数中的“firstName”也不会报告为错误。

所以问题是,处理结构子类型的最佳实践是什么。我可以在“修复”问题的类中引入无用的属性,例如

编译器现在报告我所期望的错误,因为 String255Required 具有与 String255 不同的属性,但这显然是不可取的。人们在做什么来避免这些问题?请注意,我正在尝试使用类来执行基于类型的业务规则。

0 投票
2 回答
1032 浏览

scala - 如何检查任何值是否为空?

我具有以下特征和类(实际上这是一种简化,真正的代码是用 Java 编写的,不在我的控制范围内):

现在我正在尝试改进我的 API 而不触及原始代码(Pimp My Library 模式):

它工作得很好:

仍然是模式匹配isEmpty很麻烦。理想情况下,我想使用结构类型并确保实现的任何类型都isEmpty适用于我的 API。

不幸的是,下面的代码不起作用。该变量e匹配任何类型,即使value没有定义isEmpty

有没有办法isEmpty仅在底层value实现时委托?

0 投票
1 回答
396 浏览

angular - 结构类型和多态 - 添加超类型

下面是使用 TypeScript 语法取自Angular框架的示例代码(多态),


AbstractControlDirective亚型


NgControl亚型

一般来说,有很多情况会遇到新的需求,在类层次结构的中间层中添加明显的超类型,这会在子类型中注入破坏,除非使用某种设计模式。使用设计模式可以使类层次结构不易出错,但会破坏层次结构。


为了避免这个问题,我们可以在不使用extends关键字的情况下保持这种层次结构吗?TypeScript 是结构类型的...

0 投票
2 回答
1675 浏览

javascript - 结构类型不是鸭子类型

如 TypeScript手册中所述:

TypeScript 的核心原则之一是类型检查关注值的形状。这有时被称为“鸭子类型”或“结构子类型”。在 TypeScript 中,接口扮演命名这些类型的角色,...


我的理解是,上面的核心原理与Duck 类型无关,而是Structural typing,因为 TypeScript 是静态类型语言。

正如wiki中提到的:它要求将类型检查推迟到运行时,并通过动态类型或反射来实现......对象的适用性取决于某些方法和属性(具有适当含义)的存在,而不是对象的实际类型。

如何理解上述 TypeScript 的核心原理?

0 投票
1 回答
58 浏览

scala - 如何在 Scala 中编写一个获取任意类的方法

编写对定义了加法操作的任何类进行操作的方法的正确方法是什么?

我想这就像

但它不工作。

0 投票
2 回答
96 浏览

arrays - 使用结构类型时出现意外错误

我是 Scala 编程的新手,所以如果这是一个愚蠢的问题,请多多包涵。我期待下面的代码能够工作,因为a有一个mkString方法。

但它给出了以下错误:

错误:(3, 16) AnyRef{def mkString(): String} 不采用类型参数 case class A[T: {def mkString(): String}](i: T)

错误:(4, 14) 值 mkString 不是类型参数 T val s = i.mkString 的成员

我正在使用 Scala 2.11.6。

任何帮助将不胜感激!谢谢 !

0 投票
1 回答
64 浏览

typescript - 结构类型和用户定义的类型保护

上面的示例在 isNonNull() 块中导致错误,因为它确定 t 的类型为 never。在 isList() 块中,t 具有 GraphQLList 和 GraphQLNonNull 两种类型。这两种类型在结构上是相同的。这是此处此处描述的相同问题还是实际上是一个错误?

它应该起作用的原因是因为 isList() 是 GraphQLList 而不是 GraphQLNonNull 的类型保护,并且在运行时它将为 List 返回 true,为 NonNull 返回 false,但 typescript 似乎并不代表相同的想法。

0 投票
0 回答
38 浏览

typescript - 为什么 TypeScript 有一个结构化的类型系统?

我认为创建面向对象的编程是因为它与人类的思维方式有关,但结构类型似乎不符合这个假设。

例如考虑两个具有相同结构的类:

我可以使用 Robot 类的引用来指向 Human 实例,反之亦然,但当然,如果你问人类,Robot 和 Human 不是一回事。

当我更改其中一个类的结构时,我还必须更改指向 Human 实例的 Robot 引用。

0 投票
1 回答
273 浏览

scala - Structural types with generics in Scala

I tried to define a structural type which is matched to an instance with a generic type. Like in this example code:

but I get a compilation error:

Parameter type in structural refinement may not refer to an abstract type defined outside that refinement def add[T](container: {def add(s: T): Boolean})(element: T): Unit = {

When I get rid of the generic type in the method and write the code like this:

it compiles but I get a runtime exception:

java.lang.NoSuchMethodException: java.util.HashSet.add(java.lang.String)

My question is: How to correctly define the structural type, so it can work with Java collections?

Note that it cannot replace them with Scala collection (it will be used with a Java library).

0 投票
1 回答
412 浏览

typescript - 在 TypeScript 中调用函数类型的联合

在 TypeScript 3.0.3 中,以下代码将给出编译时错误:

typescriptlang.org 上的代码

我希望 f 的类型是function f(): {left:String; right:String} => String或等价的(例如,Scala 类型检查器报告了这样的类型)。

但是,我收到以下类型错误:

尽管我们可以引用对象类型联合中的字段,但函数类型的联合似乎不能直接调用。

有什么方法可以修改f()为可调用的,同时在其中保留if-statement 吗?