【问题标题】:How can I set data type from variable value in TypeScript?如何从 TypeScript 中的变量值设置数据类型?
【发布时间】:2022-01-15 17:55:01
【问题描述】:

我对 TypeScript 和相关技术非常陌生。 :wink:


我使用 Nest.js 和 cache-manager。在cache-manager 中,我可以使用await this.cacheManager.get<type>(key) 来获取一个键值。 type 需要替换为真实类型(显然)。

由于cache-manager 将所有值保存为字符串,我想强制执行值的类型。我在cache-managerkey/type 值下创建了另一条记录。由于这是一个字符串,我如何将它作为数据类型传递给this.cacheManager.get<type>()

更新

这是一个更直观的示例,说明我想使用 switch() 执行的操作……应该有一种更简洁的方法来使用某种动态类型(或者无论如何调用它)。

async getValue(name: string, type?: string): Promise<boolean | number | object | string> {
  type ||= await this.cacheManager.get<string>(`${name}/type`) || 'string'

  switch (type) {
    case 'boolean':
      return await this.cacheManager.get<boolean>(name)
    case 'number':
      return await this.cacheManager.get<number>(name)
    case 'object':
      return JSON.parse(await this.cacheManager.get<string>(name))
    default:
      return await this.cacheManager.get<string>(name)
  }
}

【问题讨论】:

  • 你可以只用return await this.cacheManager.get(name) 替换整个switch 语句,因为所有四个分支都做同样的事情。它们只是有不同的类型注释,无论如何在编译过程中都会被删除。 cacheManager.get 方法在运行时没有关于您调用它的类型参数的信息,因此它不能根据该类型参数返回不同的东西。假设这不是你想要的行为,你得想好如何在 Javascript 中做你想做的事,然后为它写类型注解; Typescript = Javascript + 类型注释。
  • 确实可以,但类型是字符串(例如'true' 字符串而不是true 布尔值)。它们不仅是不同的注释,而且它们被转换(例如字符串到布尔值),b/c 我可以将它们用作布尔值,而不是字符串。基本上,我想要的只是从字符串值(例如'number' 字符串→number 类型)创建类型注释(或简单地 type)。
  • 它们没有被转换;您编写的代码不会转换它们。当您以任何方式运行代码时,类型注释不会影响您的代码实际执行的操作。
  • 嗯,cacheManagercache-manager 的一个实例(实际上是作为import {Cache} from 'cache-manager' 导入的),cache-manager 进行转换。
  • 然后你可以用一个return 语句替换整个switch 语句,正如我所说的。 (或者不是,现在您已经编辑为在一个分支中使用 JSON.parse;但按照目前的编写,您的代码只需要两个分支,而不是四个。)

标签: typescript typing


【解决方案1】:

也许尝试使用泛型?像这样的:

async getCacheValue<T>(name: string): Promise<T> {
 return await this.cacheManager.get<T>(name)
}

然后像这样调用方法:

getCacheValue<type>(name)

我完全不熟悉 Nest.JS 或缓存管理器,如果我不理解,很抱歉,但这可能会为您指明正确的方向

【讨论】:

  • 嗯,是的,我的意思是这样,但是,我(还)不熟悉泛型。但是,请参阅更新的 OP:我用我当前使用的函数替换了 switch()。这个问题与 Nest.js 和 cach-manager 无关;这是一个纯粹的 TS 和打字问题。 :wink: ... 你能找到一种方法来定义泛型类型吗?请记住type 变量定义?
猜你喜欢
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2016-08-19
  • 2019-06-13
  • 2017-04-14
  • 1970-01-01
相关资源
最近更新 更多