首页 > 解决方案 > 如何在 typescript 中声明一个类,就像使用“class”关键字一样?

问题描述

打字稿中的类有点奇怪,因为它们似乎既是实际的“事物”(在这种情况下是函数)又是打字稿类型。

例子:

class Test {
  public x: string = 'test';
}

function printX(test: Test) {
  console.log(test.x);
}

function createTest() {
  return new Test();
}

注意我可以说printX接受类型 Test的参数,但也用作方法中TestcreateTest()。所以同一个符号“ Test”既是值又是类型。

如何在不使用明显class关键字的情况下重新创建相同类型的构造?

例如:

function makeTestClass() {
  return class Test {
    public x: string = 'test';
  };
}

const Test = makeTestClass();

function printX(test: Test) {
  console.log(test.x);
}

function createTest() {
  return new Test();
}

这段代码不会编译,因为打字稿会认为Test是一个值,而不是一个类型。

那么有什么方法可以告诉我打字稿Test实际上是你使用class关键字得到的神奇的双重类型/值吗?

标签: typescripttypes

解决方案


我相信最接近您的要求的人可能会得到类似的东西:

interface Test {
  x: string
}

const Test = function Test(this: Test){
  this.x = 'string' as string
  return this
} as unknown as { new (): Test }

function printX(test: Test) {
  console.log(test.x);
}

function createTest() {
  return new Test();
}

游乐场链接

在这里Test,我们为类实例的值定义接口(类型级别)。以及用于创建我们的实例的构造函数Test(值级别)。由于函数没有内置构造函数签名,我们必须断言 ( as unknown as { new (): Test }) typescript 该函数仍然可以用作带有new关键字的构造函数。

这个功能还缺少很多真正的功能class。它不支持继承,也不能设置私有(在打字稿意义上)成员或方法。还要记住,接口也不能完全模仿class实例。因为他们也无法描述private成员或方法。


推荐阅读