【发布时间】:2022-01-15 17:55:01
【问题描述】:
我对 TypeScript 和相关技术非常陌生。 :wink:
我使用 Nest.js 和 cache-manager。在cache-manager 中,我可以使用await this.cacheManager.get<type>(key) 来获取一个键值。 type 需要替换为真实类型(显然)。
由于cache-manager 将所有值保存为字符串,我想强制执行值的类型。我在cache-manager 的key/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)。 -
它们没有被转换;您编写的代码不会转换它们。当您以任何方式运行代码时,类型注释不会影响您的代码实际执行的操作。
-
嗯,
cacheManager是cache-manager的一个实例(实际上是作为import {Cache} from 'cache-manager'导入的),cache-manager进行转换。 -
然后你可以用一个
return语句替换整个switch语句,正如我所说的。 (或者不是,现在您已经编辑为在一个分支中使用JSON.parse;但按照目前的编写,您的代码只需要两个分支,而不是四个。)
标签: typescript typing