gpt4 book ai didi

javascript - 从继承自基类型的类列表中返回类型 T 的项 - typescript

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:09 24 4
gpt4 key购买 nike

我有一个类 (Foo) 用于保存项目列表,所有项目列表都继承自基类型 (IBar),此列表可以包含任意数量的这些项目。

我遇到的问题是,我正在尝试在 Foo 上创建一个 get 方法,该方法采用仅限于从 IBar 继承的类型的通用类型。

我目前拥有的接口(interface)和类是:

interface IBar {
bar : string;
}

interface IFizz extends IBar {
buzz : string;
}

class Foo {

get<T extends IBar>() : T {
var item = this.list[0];
return item;
}

list : Array<IBar>;
}

我尝试运行的代码是:

var foo = new Foo();
var item = foo.get<IFizz>();

我在上面知道列表是空的,但这更多是为了让 Typescript 编译器不显示错误。调用 foo.get 的那一行没问题,没有报错,问题是 get 方法本身。我从上面得到的错误是“Type 'IBar' is not assignable to type 'T'”。

如果以 C# 为引用,上面的内容会起作用(我相信)并且欢迎任何书面示例来帮助我解决这个问题。

谢谢

最佳答案

上述代码在 C# 中也不起作用。两种语言都试图阻止你这样做,因为这不是类型安全的。考虑以下代码:

class Foo {
get<T extends IBar>() : T {
var item = this.list[0];
return item;
}

list : Array<IBar> = [ new OneClass() ];
}

var foo = new Foo();
var item = foo.get<AnotherClass>();

OneClassAnotherClass 都实现了 IBar,但是 list[0] 是类型 OneClass 但调用者请求 AnotherClass 的实例。因此,如果编译器允许您编写的代码,您将 item 键入为 AnotherClass 但持有 OneClass 的实例,这可能会导致运行时错误。

就像在 C# 中一样,您可以强制 typescript 编译器让您使用类型断言(或类似地在 C# 中进行强制转换)来执行此操作。虽然您可以这样做,但您应该有另一种机制来确保数组中的项目实际上是 T 的正确类型:

class Foo {
get<T extends IBar>() : T {
var item = this.list[0];
return item as T;
}
list : Array<IBar> = [];
}

var foo = new Foo();
var item = foo.get<IFizz>();

关于javascript - 从继承自基类型的类列表中返回类型 T 的项 - typescript ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50328679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com