获取变量的TypeScript类型

qcuzuvrc  于 2023-02-25  发布在  TypeScript
关注(0)|答案(1)|浏览(188)

是否有一个表达式的计算结果为TypeScript认为某个值所在的类型?
我一直在尝试搜索,但所有的答案都是关于Javascript的运行时类型,而不是TypeScript的类型。
例如

const a = 5 as unknown as string;
console.log(typeof a);
// number

上面的代码打印“number”是因为它在运行时从JavaScript获取类型。但是,Typescript假设a是一个String。下面的类型检查是因为TypeScript认为a是一个String:

function naiveType(v: string): string {
  return "string";
}

const a = 5 as unknown as string;
console.log(naiveType(a));
jdgnovmf

jdgnovmf1#

不管怎样,这在TypeScript编译器中是不可能的。
TypeScript的设计非目标之一是:
1.在程序中添加或依赖运行时类型信息,或者根据类型系统的结果发出不同的代码。相反,鼓励使用不需要运行时元数据的编程模式。
如果有一个tsTypeof运算符按您所需的方式工作,则TypeScript代码

// TS
const a = 5 as unknown as string;
console.log(tsTypeof a);

我需要编译成类似下面的JavaScript

// JS
const a = 5;
console.log("string");

而TypeScript代码

// TS
const a = 5 as unknown as number;
console.log(tsTypeof a);

需要编译成类似于

// JS
const a = 5;
console.log("number");

这意味着tsTypeof a将根据类型系统的结果编译成不同的东西,这违反了规则。
如果有人要为这样的操作员打开一个特性请求,几乎肯定会被拒绝,因为人们不能真实地选中the TypseScript feature request issue template中的复选框
这可以在不根据表达式类型发出不同JS的情况下实现。
如果你想要这样的东西,你需要添加一个构建步骤,比如说,使用the TypeScript compiler API来处理你的TypeScript代码,并将其转换成一种保留编译时类型信息的形式。当然,现有的框架可以为你做这件事,比如Deepkit的typeOf()函数。但这让我们走出了纯粹的TypeScript领域,进入了外部工具。这不是这个问题的重点。

相关问题