#typescript #type-checker #generate-typescript #javascript #ts #command-line-interface #cli

app ts-runtime-typechecker

一个命令行工具,可以将TypeScript类型转换为ts/js类型检查函数

1个不稳定版本

0.1.6 2024年1月23日

162编程语言

GPL-3.0 许可证

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 接口 BarBaz 及对应的生成的类型检查函数 isBarisBaz

// 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