Typescript通用接口<T>扩展了相同的名称

Mic*_*per 3 interface typescript

这显然可以在C#中正常工作,但不能在Typescript中工作,是否有解决方法,还是我只需要使用其他名称?

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

export interface IThing {
Name?: string;
ValueStr?: string;
Type?: string;
}
Run Code Online (Sandbox Code Playgroud)

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

抱歉,如果我很稠密!

Tit*_*mir 5

您需要使用不同的名称,识别接口时仅名称才有意义,而泛型类型参数的数量则无关紧要。

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

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

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

var d: IThing;
var foo: IThing<number> 
Run Code Online (Sandbox Code Playgroud)

  • @Tao,好吧,如果它们合并,那么它就不是不同的接口:) 问题是您是否可以同时拥有一个带有泛型参数的接口和一个没有泛型参数的接口,就像在 C# 中一样。 (2认同)

Tao*_*Tao 0

编辑2

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


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

export interface IThing<T> {
    Name?: string;
    ValueStr?: string;
    Type?: string;
}
Run Code Online (Sandbox Code Playgroud)

编辑

interface IThing<T> extends IThing
Run Code Online (Sandbox Code Playgroud)

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

interface IThing<T>
Run Code Online (Sandbox Code Playgroud)

游乐场演示