【问题标题】:Typescript generic interface<T> extending same nameTypescript 通用接口<T> 扩展同名
【发布时间】:2018-07-26 09:53:45
【问题描述】:

这显然在 C# 中可以正常工作,但在 typescript 中不行,有没有办法解决它还是我只需要使用不同的名称?

export interface IThing<T> extends IThing {
 Value: T;
}

export interface IThing {
Name?: string;
ValueStr?: string;
Type?: string;
}

我得到'所有 IThing 声明必须具有相同的类型参数'

抱歉,如果我太密集了!

【问题讨论】:

  • @maccettura 公平点

标签: typescript interface


【解决方案1】:

您需要使用不同的名称,识别接口时只有名称很重要,而不是泛型类型参数的数量。

在 Typescript 中,泛型在编译时被删除,因此无法区分泛型类的不同实例化。 尽管接口只是一个编译时构造,并且可能通过名称和泛型参数的数量来区分,但我的猜测是,由于类以这种方式工作,因此决定让接口以相同的方式工作。

一种解决方法是为接口使用默认类型参数:

export interface IThing<T = any> {
    Name?: string;
    ValueStr?: string;
    Type?: string; 
    Value: T;
}

var d: IThing;
var foo: IThing<number> 

【讨论】:

  • 其实可以的,这叫声明合并,但是名称和类型参数要匹配。
  • @Tao,如果它们被合并,那么它不是不同的接口:) 问题是你是否可以同时拥有一个带有泛型参数的接口和一个没有泛型参数的接口,就像在 C# 中一样.
  • 啊,好吧,因为我不太了解 C#,所以我没有得到问题的起源。 :) 另外,当我发布我的答案时,extends 不在那里,所以看起来他试图合并它们。
  • 这是不对的。 所有 类型在编译期间被删除,而不仅仅是泛型。不这样想会导致悲伤。
  • @AluanHaddad true,所有类型注解都被删除了,但是你可以根据它们的构造函数来区分两个类,使用instanceof会区分两个类。但是没有什么能区分同一个泛型类的两个不同实例
【解决方案2】:

编辑 2

我误解了这个问题,所以这不是一个正确的答案。我将在这里留下来展示如何使用声明合并。


第一个声明有一个类型参数T,而第二个没有。只要确保它们都具有类型参数即可。

export interface IThing<T> {
    Name?: string;
    ValueStr?: string;
    Type?: string;
}

编辑

interface IThing<T> extends IThing

这行不通,正如我上面所说,只需确保两个接口声明具有相同的名称和相同的类型参数

interface IThing<T>

Playground Demo

【讨论】:

  • 声明合并实际上是不能被允许的原因之一。使用默认类型参数,无论您是尝试扩展还是合并,都将是模棱两可的。
猜你喜欢
  • 2020-06-09
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 2020-10-30
  • 2016-07-06
  • 2017-10-21
相关资源
最近更新 更多