【问题标题】:Typescript interface A extends B, but is missing properties from B?Typescript 接口 A 扩展了 B,但缺少 B 的属性?
【发布时间】:2021-01-08 07:49:55
【问题描述】:

显然,我不明白 TypeScript 接口是如何工作的。 我有这个:

import type { Socket, Handshake } from 'socket.io';
import type { Session } from './session';

export interface SessionHandshake extends Handshake {
  session: Session;
}

export interface SessionSocket extends Socket {
  handshake: SessionHandshake;
  id: string;
}

我在这里尝试做的是从 socket.io 扩展给定的“Socket”接口,方法是添加一个“id”属性并扩展“handshake”属性。 TypeScript 不接受后者。 TS 声称“SessionHandshake 缺少 Handshake 类型的 x、y、z 属性”。 但这怎么可能呢?我将 SessionHandshake 定义为 Handshake 接口的扩展。 TS 怎么能声称它不具备 Handshake 的所有属性?

在此处使用 TS 4.1.3。

【问题讨论】:

  • 你是如何使用这些类型的?什么代码抛出 "SessionHandshake is missing x, y, z properties from type Handshake" 错误?
  • 这是一个编译错误。 export interface SessionSocket 告诉我存在问题:“接口 'SessionSocket' 错误地扩展了接口 'Socket'。属性 'handshake' 的类型不兼容。类型 'SessionHandshake' 缺少来自类型 'Handshake' 的以下属性:标头、时间、地址、xdomain 和另外 5 个。`

标签: typescript interface extension-methods


【解决方案1】:

关键字extends只能用于接口和类。

Handshake 是一个类型,因此不能使用关键字extends

如果您只想声明具有附加属性的类型,可以使用intersection type

export type SessionHandshake = Handshake & { session: string };

【讨论】:

  • 我现在不接受这个答案,尽管它首先对我来说是有道理的(尽管没有解释原因)。 Typescript Discord 中的人告诉我,扩展类型没问题。 (事实上​​,这不是我的编译器所抱怨的。只是扩展并没有给我带来预期的结果:删除被扩展的原始类型的属性。)他们说根本问题似乎是我的类型m 扩展自是一个类。 (即使编译器再一次没有抱怨扩展,它只是不会导致我期望的结果:删除属性。)
  • 哦,有道理。感谢您的解释!
  • 这对我来说仍然没有意义,哈哈。我还是不明白为什么会这样。
猜你喜欢
  • 1970-01-01
  • 2019-10-14
  • 2014-11-02
  • 1970-01-01
  • 2020-08-24
  • 2022-11-16
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多