扩展 class 和接口的 Typescript 泛型
Typescript generics extending class and interface
我有一个 Typescript class,其中包含一个泛型,需要扩展另一个 class 并实现一个接口。这是一个例子
interface IHasImage {
imageUrl():string;
}
class Model {
}
class View<T extends Model & IHasImage> {
}
这是我在其他地方看到的那种语法,但是在 Typescript 中有没有办法做到这一点?
编辑:
尝试将以下内容粘贴到操场上:http://www.typescriptlang.org/Playground
...[removed edit 1 code]
编辑 2:答案和推理
(抱歉,第一个例子有一些缺陷!)
我在下面标记了正确的答案,尽管它可能需要一些提示,如本 github 问题 (https://github.com/Microsoft/TypeScript/issues/1885)
中所述
给定以下代码,您可以看到该方法有效。
唯一要说的是,尝试 implement
来自 class 不扩展基 class 的接口也失败了。然而,因为 Typescript 检查是 基于对象的结构 ,所以如果您手动将 name
属性 添加到 class,它将成功。
这也是 ModelCorrect
成功的原因,而 extends
但 implements
没有。
看来这是我能找到的唯一方法。不是很干净,但它做对了。
interface IHasImage extends Model{
imageUrl():string;
}
class Model {
}
class View<T extends IHasImage> {
}
这是 playground 的屏幕截图,验证它是否有效:
编辑: 添加了正确的解决方法。
Typescript 不像 Java 或 C# 那样有限制,所以你可以这样做:
interface IHasImage {
imageUrl():string;
}
class Model {
}
// use the Model class like an interface
interface IHasImageModel extends IHasImage, Model{
}
class View<T extends IHasImageModel> {
constructor(arg :T){
arg.imageUrl();
}
}
编辑:
在 TypeScript 1.6 中,您可以使用交集类型:
interface IHasImage {
imageUrl():string;
}
class Model {
}
class View<T extends IHasImage & Model> {
constructor(arg :T){
arg.imageUrl();
}
}
示例中缺少的是 T 的内容:
在下面的示例中,我为 T 添加了一个实现,它可以用作通用约束。
interface IHasImage {
imageUrl():string;
}
class Model {
}
class ModelWithImage extends Model implements IHasImage {
imageUrl():string
{
return "http://thepetwiki.com/images/thumb/Kitten.jpg/400px-Kitten.jpg";
}
}
class View<T extends ModelWithImage>
{
value:T;
constructor(arg:T)
{
this.value=arg;
}
}
我有一个 Typescript class,其中包含一个泛型,需要扩展另一个 class 并实现一个接口。这是一个例子
interface IHasImage {
imageUrl():string;
}
class Model {
}
class View<T extends Model & IHasImage> {
}
这是我在其他地方看到的那种语法,但是在 Typescript 中有没有办法做到这一点?
编辑: 尝试将以下内容粘贴到操场上:http://www.typescriptlang.org/Playground
...[removed edit 1 code]
编辑 2:答案和推理
(抱歉,第一个例子有一些缺陷!) 我在下面标记了正确的答案,尽管它可能需要一些提示,如本 github 问题 (https://github.com/Microsoft/TypeScript/issues/1885)
中所述给定以下代码,您可以看到该方法有效。
唯一要说的是,尝试 implement
来自 class 不扩展基 class 的接口也失败了。然而,因为 Typescript 检查是 基于对象的结构 ,所以如果您手动将 name
属性 添加到 class,它将成功。
这也是 ModelCorrect
成功的原因,而 extends
但 implements
没有。
看来这是我能找到的唯一方法。不是很干净,但它做对了。
interface IHasImage extends Model{
imageUrl():string;
}
class Model {
}
class View<T extends IHasImage> {
}
这是 playground 的屏幕截图,验证它是否有效:
编辑: 添加了正确的解决方法。
Typescript 不像 Java 或 C# 那样有限制,所以你可以这样做:
interface IHasImage {
imageUrl():string;
}
class Model {
}
// use the Model class like an interface
interface IHasImageModel extends IHasImage, Model{
}
class View<T extends IHasImageModel> {
constructor(arg :T){
arg.imageUrl();
}
}
编辑: 在 TypeScript 1.6 中,您可以使用交集类型:
interface IHasImage {
imageUrl():string;
}
class Model {
}
class View<T extends IHasImage & Model> {
constructor(arg :T){
arg.imageUrl();
}
}
示例中缺少的是 T 的内容:
在下面的示例中,我为 T 添加了一个实现,它可以用作通用约束。
interface IHasImage {
imageUrl():string;
}
class Model {
}
class ModelWithImage extends Model implements IHasImage {
imageUrl():string
{
return "http://thepetwiki.com/images/thumb/Kitten.jpg/400px-Kitten.jpg";
}
}
class View<T extends ModelWithImage>
{
value:T;
constructor(arg:T)
{
this.value=arg;
}
}