TS如何解释具有相同命名函数属性但签名不同的类型的交集(与接口相同会产生错误)?

依云

当我有一个具有两个作为函数的属性的类型A,然后定义一个类型B与它具有与A相同的函数属性的新类型时,该类型B是类型A的交集类型,那么TS如何理解这一点?如果使用接口完成此操作,将是一个错误,因为接口B将具有b的调用签名,而该调用签名将与接口A的调用签名不兼容。

type A = {
    a(x: number): string,
    b(x: number): string
}

type B = A & {
    a(x: string): string,
    b(x: number): string
}

const b: B = {
    a: (x: string | number) => x,
    b: (x: number) => x
}

在const变量b的两个属性上均显示错误,但在实际的类型定义上均未显示。那么什么是B类型变量的有效声明?

贾卡尔兹

TypeScript将函数类型的交集视为函数重载因此,相同类型的每个其他调用签名(或者,在上述情况下,同一个名称的每个其他方法声明)在该函数(或方法)的重载列表中充当附加的调用签名。从文档中并不清楚。(大部分已过时的)TypeScript规范文档中有一个部分说明了有关可调用类型的交集:

的交点型的表观成员如下确定...当一个或多个组成类型的有一个呼叫签名小号具有明显的呼叫签名小号签名按I中组成类型的顺序排序,作为每种组成类型的签名的串联

基本上,这意味着函数的交集的行为类似于具有交集中每个调用签名的函数,其顺序与交集相同。具有调用签名的有序列表的函数至少在TypeScript中是“重载函数”的含义。


所以,那个路口是不是一个错误,而是指定您希望的方式B有一个a方法有两个不同的签名,并且b有两个相同的特征,这样的方法:

interface IB {
    a(x: number): string;
    a(x: string): string;
    b(x: number): string;
    b(x: number): string;
}

有点奇怪,尤其是对于b,但不是错误。

之所以不能A作为接口使用,B extends A是因为extends它与交集无法完全相同。因为B extends A根本不允许您声明不兼容的属性。即使对于非功能部件也是如此。interface C {x: number | string}并且interface D extends C {x: string | boolean}由于string | boolean无法分配给无法正常工作number | string这是不一样的交集(number | string) & (string | boolean)这仅仅是string


无论如何,您在b变量中出现了错误为什么?好吧,因为您的ab方法都没有返回正确的类型。a回来string | number和你b回来number但是所有的方法B都应该返回string

让我们修复一下:

const b: B = {
    a: (x: string | number) => String(x),
    b: (x: number) => String(x)
} // no error now

现在看起来还好。好吧,希望能有所帮助;祝好运!

链接到代码

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在vbscript中重命名具有相同扩展名的不同命名文件

Kotlin允许与具有不同返回类型的属性getter相同的函数签名

如何在Python 3中使用类型注释重载不同接口的相同命名方法

如何过滤类的相同命名属性

如何转换具有相同签名的函数类型?

Mockito模拟具有相似签名的相同命名方法

为什么不以不同单位调用具有相同签名的函数会导致编译器错误?

具有相同签名但在两个接口不同的返回类型的方法

实现两个具有相同方法签名但返回类型不同的接口

Java类具有2个具有相同函数签名但返回类型不同的方法

多次实现相同的通用接口,该通用接口包含具有不同类型参数的属性

XmlSerializer 重用具有不同命名空间的相同类

c++ - 具有相同名稱但不同命名空間的類的繼承

如何声明 100 个相同类型的不同命名变量?

Swift,具有相同命名静态函数的派生类

具有相同类型属性的接口或类型的 Typescript 简写

如何解析具有相同标签名称的XML

我该如何解决该错误后续属性声明必须具有相同的类型。角度9

不同的类型在CIL中具有相同的签名

Nats.io:具有不同主题但具有相同命名队列的订户是否可以并行处理消息?

处理具有相同签名但参数含义不同的函数

Typescript实现具有相同键但类型不同的接口

为什么两个.C文件中的相同命名专用函数会导致多个定义错误?

Java 8-两个接口包含具有相同方法签名但返回类型不同的默认方法,如何覆盖?

不同的函数如何具有相同的名称?

如何处理算法中具有不同命名成员函数的类?

为不同命名空间中具有相同名称的两个服务设置两个入口

如果具有相同接口的类具有相似但方法签名不同,该怎么办?

如何实现具有参数相同,但不同签名的方法