当前位置: 首页 > 知识库问答 >
问题:

如何正确键入在TypeScript中返回类的函数?

鱼渝
2023-03-14

在TypeScript中,< code>class关键字引入了值和类型:

class Plain { };
const plain: Plain = new Plain();

有没有一种方法可以使函数返回既是类型又是值的东西?

问这个问题的另一种方法是:有没有办法在下面声明createclass的类型,以便const a2:动物=新动物()类型检查?

declare function createClass<T extends string>(t: T): (new () => { type: T });

const Animal = createClass("animal");

const a1         = new Animal();
const a2: Animal = new Animal(); // Error: 'Animal' refers to a value, but is being used as a type here.
const a3: InstanceType<typeof Animal> = new Animal(); // OK but verbose, even if I make a type alias

看到这个打字游戏了吗

共有1个答案

沃侯林
2023-03-14

类声明同时生成类型和值。该值是类的构造函数(这就是为什么当您在表达式中编写新的 Plain() 时,您会调用构造函数)。类型与类同名,表示类的实例类型(这就是您可以在类型注释中使用它的原因)

另一方面,const只是一个值,即使它确实包含一个类。没有相应的类型。实现与类声明类似的功能的唯一方法是创建具有相同名称的类型别名。

declare function createClass<T extends string>(t: T): (new () => { type: T });

const Animal = createClass("animal");
type Animal = InstanceType<typeof Animal>

const a1         = new Animal(); 
const a2: Animal = new Animal(); 

该类型的值位于不同的域中,因此使用相同的名称没有问题。

不幸的是,没有办法在单个语句中做到这一点,这涉及到一些冗长。

 类似资料:
  • TS演示:https://tsplay.dev/mLO04N , 问题:当我将reduce中返回对象的children注释去掉,返回的类型就变成any了,请问正确姿势应该是? 我把提取的值像这样复制给一个对象,获取的类型是对的,但是如果把这个对象作为返回数据类型就不对了 请不要试图类似用下面断言的方式来解决,我试图通过正确的姿势获取数据类型:

  • 我在这里查过了https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md这是TypeScript语言规范,但我找不到如何声明函数的返回类型。 我在下面的代码中展示了我所期望的: 我知道我可以用

  • 我在玩TypeScript中的条件类型。我想用条件返回类型编写一个函数。如果函数被传递一个字符串,它将返回一个名称,否则它将返回一个Id。 我在返回语句中得到以下错误: 我错过了什么?Thnx! 编辑:直接摘自Anders Hejlsberg在Build 2018上的演讲:https://youtu.be/hDACN-BGvI8?t=2241 他甚至说“我们不再需要写函数重载了…” 如果我将代码更

  • 我使用React和Redux,并将动作类型指定为接口,这样我的还原程序就可以利用标记的联合类型来提高类型安全性。 我有如下类型声明: 我想创建创建这些动作的助手函数,我倾向于使用箭头函数。如果我这样写: 编译器无法提供任何帮助来确保这是一个有效的,因为没有明确指定返回类型。我可以通过执行以下操作显式指定返回类型: 但这需要指定我的函数参数两次,因此冗长且难以阅读。 在使用箭头符号时,有没有一种方法

  • 我有一个返回[异常,字符串]的方法 } 现在我为类B和I存根方法验证编写测试 是否可以以这种方式存根以返回函数的右(......)?

  • 我在TypeScript中有一个接口或抽象类,我有一大堆实现/扩展接口/类的类,我想用所有子类的构造函数生成一个数组,但我想把数组类型为接口/超类。这可能吗? 可以将键入以外的任何内容吗?我想尽可能地说得具体些。我知道在ActionScript中您至少可以执行,在Haxe中您可以执行,但是在TypeScript中您甚至不能作为afaik键入。