1个不稳定版本
0.1.6 | 2024年1月23日 |
---|
162 在 编程语言
60KB
1.5K SLoC
Typescript 运行时类型检查器
一个命令行工具,可以根据给定的TypeScript文件中的接口生成TypeScript运行时类型检查函数。这些类型检查函数可以用于在运行时验证对象的结构和类型,从而提高TypeScript项目的类型安全性。
安装
使用cargo进行安装cargo install ts-runtime-typechecker
用法
通过提供输入TypeScript文件的路径和所需输出文件路径来运行此工具
ts-runtime-typechecker <INPUT-FILE-PATH> <OUTPUT-FILE-PATH>
功能
支持
- TypeScript常见类型
string
|number
|boolean
|true
|false
undefined
|null
|unknown
|any
object
|symbol
|bigint
- JavaScript原始类型
- 字符串,例如
"str"
- 数字,例如
12_000
- 字符串,例如
- 数组
T[]
数组<T>
- 元组
[T,U,P,...]
- 运算符
|
&
- 泛型或其他类型
数组<T>
函数
- 接口声明合并
尚未支持
- 函数类型:例如
() => void
- 索引访问类型:例如
Foo["bar"]
- 条件类型:例如
RegExp extends Foo ? number : string
- 映射类型:例如
[key: string]: boolean;
- TypeScript 工具类型:例如
Required<T>
- 一些关键字:例如
keyof
|typeof
|extends
|implements
示例
TypeScript 接口 Foo
及对应的生成的类型检查函数 isFoo
。
// input file:
interface Foo {
foo: string | number;
bar: "str" | "";
foobar: 0 | 100_000;
baz: number[] | null | undefined;
qux: {
faz: Array<number>;
boo: (number | "str")[][];
foobaz: object;
barbaz: [bigint, symbol];
};
}
// output file:
export function isFoo(o: unknown): o is Foo {
return (
o != null &&
typeof o === "object" &&
Object.keys(o).length === 5 &&
"foo" in o &&
(typeof o["foo"] === "string" || typeof o["foo"] === "number") &&
"bar" in o &&
(o["bar"] === "str" || o["bar"] === "") &&
"foobar" in o &&
(o["foobar"] === 0 || o["foobar"] === 100000) &&
"baz" in o &&
((Array.isArray(o["baz"]) && typeof o["baz"]["0"] === "number") ||
o["baz"] === null ||
typeof o["baz"] === "undefined") &&
"qux" in o &&
typeof o["qux"] === "object" &&
o["qux"] != null &&
Object.keys(o["qux"]).length === 4 &&
"faz" in o["qux"] &&
Array.isArray(o["qux"]["faz"]) &&
typeof o["qux"]["faz"]["0"] === "number" &&
"boo" in o["qux"] &&
Array.isArray(o["qux"]["boo"]) &&
(typeof o["qux"]["boo"]["0"] === "number" ||
(Array.isArray(o["qux"]["boo"]["0"]) && o["qux"]["boo"]["0"]["0"] === "str")) &&
"foobaz" in o["qux"] &&
typeof o["qux"]["foobaz"] === "object" &&
"barbaz" in o["qux"] &&
Array.isArray(o["qux"]["barbaz"]) &&
o["qux"]["barbaz"].length === 2 &&
typeof o["qux"]["barbaz"]["0"] === "bigint" &&
typeof o["qux"]["barbaz"]["1"] === "symbol"
);
}
TypeScript 接口 Bar
、Baz
及对应的生成的类型检查函数 isBar
、isBaz
。
// input file:
interface Bar {
foo: number | Baz;
}
interface Baz {
foo: string;
}
interface Bar {
bar: [Baz]
}
// output file:
export function isBar(o: unknown): o is Bar {
return (
o != null &&
typeof o === "object" &&
Object.keys(o).length === 2 &&
"foo" in o &&
(typeof o["foo"] === "number" ||
(typeof o["foo"] === "object" &&
o["foo"] != null &&
Object.keys(o["foo"]).length === 1 &&
"foo" in o["foo"] &&
typeof o["foo"]["foo"] === "string")) &&
"bar" in o &&
Array.isArray(o["bar"]) &&
o["bar"].length === 1 &&
typeof o["bar"]["0"] === "object" &&
o["bar"]["0"] != null &&
Object.keys(o["bar"]["0"]).length === 1 &&
"foo" in o["bar"]["0"] &&
typeof o["bar"]["0"]["foo"] === "string"
);
}
export function isBaz(o: unknown): o is Baz {
return (
o != null && typeof o === "object" && Object.keys(o).length === 1 && "foo" in o && typeof o["foo"] === "string"
);
}
许可证
本项目采用 GNU 通用公共许可证 v3.0 许可 - 请参阅 LICENSE 文件以获取详细信息。
依赖项
约 1.5MB
约 25K SLoC