打字稿+将字符串转换为类型并使用类型的大小写

假设我有这种类型

export type CoolType = 'Super' | 'Whatever' | 'Another'
// notice they all start with an uppercase letter

所以现在,这将返回“超级”

console.log('super' as CoolType)

...但我希望它返回类型中给定的值,即“超级”。我怎样才能做到这一点?

回答

当 TypeScript 代码被发送到 JavaScript 代码时,TypeScript 的静态类型系统被删除。这包括诸如 的type别名CoolType和诸如 的类型断言as CoolType。TypeScript 并不是真的要添加任何超出某些版本的 JavaScript 为您提供的运行时功能。您上面的代码将编译为

console.log('super');

并且除了"super".

请注意,这"super" as CoolType是一个类型断言,而不是运行时强制转换。不幸的是,术语“演员”是模棱两可的,因此最好避免使用。类型断言应该是当您告诉编译器类型在运行时会变成什么时。在您了解的有关值类型的信息比编译器所能计算的更多的情况下,它很有用。这是一个预测,而不是命令。所以"super" as CoolType意思是“我知道你没有意识到这一点,编译器,但"super"实际上是类型CoolType”......这是一个谎言。哎呀。


一般来说,你应该问自己“我怎么能用纯 JavaScript 做到这一点”,然后编写代码。TypeScript 可以帮助您提供更强的类型保证,并在您在开发中出错时发出警告,但它不会从根本上改变运行时发生的情况。因此,您可以在运行时采用的一种方法如下:

function toCoolType(s) {
  return ['Super', 'Whatever', 'Another'].
    find(c => c.toLowerCase() === s.toLowerCase());
}

console.log(toCoolType('super')) // Super

这会起作用,虽然它不如 漂亮"super" as CoolType,但它具有实际做某事的优势。然后,要将其转换为 TypeScript,您可以添加一些类型信息:

function toCoolType(s: string): CoolType | undefined {
  return (['Super', 'Whatever', 'Another'] as const).
    find(c => c.toLowerCase() === s.toLowerCase());
}

console.log(toCoolType('super')) // Super

并且编译器现在将理解输出的toCoolType()是 aCoolTypeundefined

const ct = toCoolType(Math.random() < 0.5 ? "whatever" : "whenever");
if (ct) {
  console.log(ct.length); // 8
} else {
  console.log("wasn't cool") // wasn't cool
}

Playground 链接到代码


以上是打字稿+将字符串转换为类型并使用类型的大小写的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>