从JavaScript扩展TypeScript接口:TypeError:类扩展未定义的值不是函数或null

时间:2019-04-24 11:19:16

标签: javascript typescript

我有一个像这样的TypeScript界面​​:

export interface Foo {
  bar: string
}

这将编译为空的.js文件。 因此,在ES6节点模块中使用TypeScript接口时,会出现此错误:

TypeError: Class extends value undefined is not a function or null

一种解决方法是创建一个类

export class BaseFoo {
  bar: string
}

现在,我可以在ES6中使用BaseFoo而不会出现上述错误。 因此,不可能只在TypeScript中使用带有ES6 interop的接口,还是有比这里的Base*类(最终不是真正的基类)更优雅的方式?

更新:我了解接口和基类背后的不同概念,但我的问题是有关如何在TypeScript中创建使用接口的库以及如何以普通ES6(不具有接口)的方式构建库的最佳实践。也可以使用此库。

1 个答案:

答案 0 :(得分:2)

我认为您误会了如何正确使用界面。接口不是“基础”对象,它们可以简单地定义对象的外观。

在打字稿中,通常将接口用作对象的类型,但通常也可以用来定义类的“外观”。

例如:

interface Foo {
  bar: string;
  baz: number;
  bang(): void;
}

在这种情况下,implements Foo的任何对象/类都需要具有这三个条件。

IE:

class FooImplemented implements Foo {
  bar = 'Hello World';
  baz = 42;

  bang() {
    print(this.bar);
  }
}

如果我未定义bar,baz和/或bang;如果我在Foo类中未正确实现FooImplemented接口,则打字稿将在编译时引发错误。

总而言之,接口告诉编译器应该是什么样子。一个接口可以扩展另一个接口。但是,类不能扩展接口,但是可以实现一个接口。 (或多个)

Check out the docs on interfaces on typescripts website.