【问题标题】: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 中节省很多字符。

标签: typescript typescript-types


【解决方案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 是一种特定类型,旨在由构建器方法返回给类的用户。因此,它不包括私有属性。
猜你喜欢
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2022-09-30
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
相关资源
最近更新 更多