如何在ts-node的REPL中查看与验证TypeScript类型?
问题分析
你遇到的核心问题是TypeScript的类型是编译时构造,运行时不存在,所以直接用console.log输出类型标识符会报错——因为DuckProps只是类型层面的定义,编译后不会生成对应的JS值。下面分两部分解决你的问题:
一、验证DuckProps的类型确实是'colors' | 'feathers'
有几种直观的方法:
编辑器悬停查看
这是最简单的方式:在VS Code、WebStorm等支持TS的编辑器里,把鼠标悬停在DuckProps这个类型名上,编辑器会直接显示它的类型为"colors" | "feathers"。通过类型检查报错间接验证
写一段测试代码,如果DuckProps不是你预期的联合类型,TypeScript会立刻抛出编译错误:type Duck = { colors: string; feathers: number; } type DuckProps = keyof Duck // 尝试给变量赋值一个不在DuckProps里的字符串 const invalidProp: DuckProps = 'weight'; // TS会报错:Type '"weight"' is not assignable to type '"colors" | "feathers"'反之,如果赋值
'colors'或'feathers'则不会报错,这就间接验证了DuckProps的类型范围。用条件类型显式验证
你可以定义一个条件类型,只有当DuckProps匹配预期类型时才返回true,否则返回false:type VerifyDuckProps = DuckProps extends 'colors' | 'feathers' ? true : false; // 悬停在VerifyDuckProps上,会看到它的类型是true,说明验证通过
二、在REPL中与TypeScript类型交互
普通的ts-node REPL默认只处理运行时的值,没法直接查询类型,但有几种方案可以实现类型交互:
用
ts-repl(专用TS类型REPL)
这是专门为TypeScript类型交互设计的REPL工具,安装后可以直接查询类型:npm install -g ts-repl启动后就能直接操作类型:
> type Duck = { colors: string; feathers: number; } > type DuckProps = keyof Duck > DuckProps "colors" | "feathers"在普通
ts-nodeREPL中通过错误提示推断类型
如果你不想额外安装工具,可以在ts-nodeREPL中通过编写触发类型错误的代码来反向推断类型。比如:> type Duck = { colors: string; feathers: number; } > type DuckProps = keyof Duck > const test: DuckProps = 'random' // 立刻会收到错误:Type '"random"' is not assignable to type '"colors" | "feathers"'从错误信息里就能看到
DuckProps的准确类型。利用编辑器内置的交互式窗口
像VS Code的“交互式窗口”或者WebStorm的REPL,支持在输入类型代码后,通过悬停查看类型信息,体验和本地开发一致。
内容的提问来源于stack exchange,提问作者user2167582

