TypeScript 如何写测试类型

在日常开发中,我们写代码会写功能测试,却常常忽略对代码的“骨架”——类型的测试。就像你做蛋糕,不仅要保证口感(功能),还要确认面粉、鸡蛋这些原料的比例(类型)没错。TypeScript 作为给 JavaScript 加类型的工具,也需要给类型做测试,避免写着写着,类型偷偷“跑偏”。

先搞懂:为什么要测 TypeScript 的类型?

很多人觉得“类型就是给编辑器看的”,但实际开发中,类型错了会直接出 bug。比如你做一个用户注册功能,要求年龄是数字,结果不小心写成了字符串,编辑器只会在你写代码时标红,但如果没有专门测类型,可能上线后才发现“18”(字符串)和 18(数字)在计算年龄时出错。给类型写测试,就是提前验证“代码里的类型是不是我们想要的”,就像给衣服做尺寸检查,避免穿错。

TypeScript 如何写测试类型

最常用的工具:type-testing 库

要测 TypeScript 类型,不用自己写复杂代码,用专门的轻量工具 type-testing 就行,它像个“类型质检员”,帮你快速检查类型对不对。举个生活化例子:你想确认“苹果是不是水果”,用这个工具就相当于拿个分类卡,直接判断“苹果”的类型是不是“水果”。

先装工具:在项目里打开终端,输入 npm install --save-dev type-testing,装完就能用它的核心方法了。

写第一个类型测试:验证“类型正确”

假设你写了一个函数,要求输入的参数必须是字符串,返回值也是字符串:

`typescript

function formatName(name: string): string {

return 用户:${name};

}

`

现在要测这个函数的类型是不是“输入字符串、返回字符串”。用 type-testing 的 expectType 方法:

`typescript

import { expectType } from 'type-testing';

// 测 formatName 的类型是否符合预期

expectType<(name: string) => string>(formatName);

`

这个代码就像你拿一个“标准模板”(输入字符串、返回字符串的函数),去比对你写的 formatName,如果匹配就通过,不匹配编辑器会直接报错——就像你拿标准尺码的衣服比,不对就没法过。

测“类型错误”:有没有抓错类型?

有时候我们还需要确认“错误的类型会被 TypeScript 拦住”,比如你想让函数只接受数字,结果传了字符串,要确保编译器能报错。用 expectError 方法来测这种情况:

`typescript

import { expectError } from 'type-testing';

// 故意传错误类型,看是不是能触发报错

expectError(formatName('123')); // 这里会报错,因为传的是字符串,和函数要求的输入类型(虽然返回是字符串,但这里的参数类型是 string 没问题?哦,举个更准确的例子:如果函数要求输入是 number,那传字符串就错)

`

改一下:假设函数是 function getAge(age: number): number,测错误类型:

`typescript

expectError(getAge('18')); // 这里会触发报错,因为参数是字符串,不是数字

`

这就像你给一个“只能装大米的桶”测,故意倒小米,看桶会不会拒绝——如果没拒绝,就说明类型检查失效了,得调整。

测“联合类型”:兼容多种类型的情况

如果你的函数接受“数字或字符串”这种联合类型,怎么测?比如:

`typescript

function printId(id: number | string): string {

return ID:${id};

}

`

要测它的类型能同时兼容数字和字符串:

`typescript

expectType<(id: number | string) => string>(printId);

// 额外测:单独传数字和字符串都没问题

expectType<string>(printId(123));

expectType<string>(printId('abc'));

`

这就像你测一个“既能装水又能装饮料的杯子”,分别倒两种液体,看都能装进去——确保联合类型的兼容是对的。

注意:类型测试不是万能的

它只能测 TypeScript 能识别的静态类型,没法测“运行时的类型”(比如用户输入的内容在运行时会不会是数字)。要补全的话,还是得加运行时检查,比如用 typeof 或者工具做参数校验。就像你测了“杯子能装水”,但还要确认“装水后不会漏”——这部分靠运行时代码。

给类型写测试,不是为了折腾,而是让你的 TypeScript 代码更严谨,就像给自行车做保养,提前把小问题解决,避免骑到半路出状况。

上一篇 JavaScript babel 怎么用