TypeScript 中是不是有在类中使用的关键字来获取其类型?

Posted

技术标签:

【中文标题】TypeScript 中是不是有在类中使用的关键字来获取其类型?【英文标题】:Is there a keyword in TypeScript used inside a class to get its type?TypeScript 中是否有在类中使用的关键字来获取其类型? 【发布时间】:2020-12-24 21:51:06 【问题描述】:

我想从类内部引用类的类型而不使用它的名称

所以如果类的名称发生变化,我不需要在多个地方更改我的代码, 即使我的类名很长,我的代码也不会再出现, 当我看到这个关键字时,我立即知道它指的是什么,而无需查找类型。

这就是我现在的样子:

class MyClassThatMightHaveAQuiteLongName 

  private myProp: SomeType;

  someMethod() 
    let foo: MyClassThatMightHaveAQuiteLongName['myProp']; // to make foo a SomeType
  


这就是我想要的方式:

class MyClassThatMightHaveAQuiteLongName 

  private myProp: SomeType;

  someMethod() 
    let foo: thatMagicKeyword['myProp']; // to make foo a SomeType
  


只是为了说明我想要什么:

class MyClassThatMightHaveAQuiteLongName 

  private myProp: SomeType;

  someMethod() 
    let foo: (typeof this)['myProp']; // to make foo a SomeType
  


这显然不起作用,因为 typeof 只返回一个字符串。

【问题讨论】:

我认为不重复MyClassThatMightHaveAQuiteLongName 至少一次是不可能的,因为您需要指定this 才能正确键入myProp 自我引用 如果您使用 IDE 重命名类,第一点就消失了。如果你的类名太长,你无法引用它们,是不是它们太长了,其他人无法引用它们,你应该选择一个更好的名字来代替? @IngoBürk 你是对的,但是,long 是相对的。即使你为你的类选择“正常长度”的名称,如果你在一个“框架环境”中,比如说 Angular,一些用于此目的的 TypeScript 关键字可以让你在MyShortNamedComponent 中节省很多字符。 【参考方案1】:

如果你使用public myProp,你可以使用'this'

class MyClassThatMightHaveAQuiteLongName 
    public myProp: SomeType;

    someMethod() 
        let foo: this['myProp']; // to make foo a SomeType
    

您还可以使用类型别名来缩短类名,假设所有类都在不同的文件中。

type ThisClass = MyClassThatMightHaveAQuiteLongName

export class MyClassThatMightHaveAQuiteLongName 
    public myProp: SomeType;

    someMethod() 
        let foo: ThisClass['myProp']; // to make foo a SomeType
    

【讨论】:

哇,谢谢,我不知道public 有这个区别。为什么会这样?这正是我想要的,但是如果属性是private,为什么这个选项不可用? @tom this 是一种特定类型,旨在由构建器方法返回给类的用户。因此,它不包括私有属性。

以上是关于TypeScript 中是不是有在类中使用的关键字来获取其类型?的主要内容,如果未能解决你的问题,请参考以下文章

static在类中的功能

友元函数和友元类

在类中声明第一个字段属性之前添加额外的行

在类中使用 openFileOutput()。 (不是活动)

在类中使用导入

使用类中的构造函数的Typescript将不允许使用new关键字