将 TypeScript 类型打印到控制台/文件中

2024-04-21

我有多种类型,形成了当前在我的服务器上使用的更大、复杂的类型。是否可以将更大、复杂的类型打印到控制台/文件中?

Example

type TypeA = {
  prop1: string;
  prop2: number;
}

type TypeB = Omit<TypeA, "prop2">;

console.logType(TypeB);
// {
//   prop1: string;
// }

为了提取类型签名,您需要使用编译器API https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API。假设你有一个文件:

// ./src/my-file.ts
type TypeA = {
  prop1: string;
  prop2: number;
}

type TypeB = Omit<TypeA, "prop2">;

从项目根目录之外的脚本:

// ./type-printer.ts
import * as ts from "typescript";

function extractTypeSignature(filename: string, aliasName: string): string {

    const program: ts.Program = ts.createProgram([ filename ], { emitDeclarationOnly: true });
    const sourceFile: ts.SourceFile = program.getSourceFile(filename);
    const typeChecker: ts.TypeChecker = program.getTypeChecker();
    // Get the declaration node you're looking for by it's type name.
    // This condition can be adjusted to your needs
    const statement: ts.Statement | undefined = sourceFile.statements.find(
      (s) => ts.isTypeAliasDeclaration(s) && s.name.text === aliasName
    );
    if (!statement) {
        throw new Error(`Type: '${aliasName}' not found in file: '${filename}'`);
    }
    const type: ts.Type = typeChecker.getTypeAtLocation(statement);
    const fields: string[] = [];
    // Iterate over the `ts.Symbol`s representing Property Nodes of `ts.Type`
    for (const prop of type.getProperties()) {
        const name: string = prop.getName();
        const propType: ts.Type = typeChecker.getTypeOfSymbolAtLocation(prop, statement);
        const propTypeName: string = typeChecker.typeToString(propType);
        fields.push(`${name}: ${propTypeName};`);
    }
    return `type ${aliasName} = {\n  ${fields.join("\n  ")}\n}`;
}

const typeBSignature = extractTypeSignature("./src/my-file.ts", "TypeB");
// write to file or console log
console.log(typeBSignature);
/*
type TypeB = {
  prop1: string;
}
 */

我已明确注释所有变量以显示类型的来源。尽管它是一个小脚本,但我建议使用 TypeScript 而不是 JavaScript 编写编译器脚本并使用tsc file.ts && node file.js或使用类似的东西ts-node https://github.com/TypeStrong/ts-node,因为类型推断/类型保护在浏览编译器 API 时非常有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 TypeScript 类型打印到控制台/文件中 的相关文章

随机推荐

  • ORA-29977: 保证模式下的查询注册不支持列类型

    我正在努力表演DatabaseChangeListener从我的 java 类中 我收到以下错误 ORA 29977 不支持查询注册的列类型 保证模式 我需要一个实现 每当表中插入新行时我都应该收到通知 这是我尝试过的代码 用于将更改通知给
  • 如何导航到新页面 React Router v4

    我正在构建一个加密货币市场应用程序来练习reactjs 当应用程序启动时 具有某些属性的货币列表将显示为列表 我需要导航到不同的页面 新页面 Currency组件 而不加载当前页面底部的组件 目前我能够将其呈现在页面底部 但这不是我需要的
  • 哪种函数式编程语言在 Eclipse 中提供最好的支持?

    作为一项练习 我的团队正在考虑学习函数式编程 选择一种语言的因素之一是它在 Eclipse 中的支持 任何带有 Eclipse 插件的语言都可以 但是哪种语言提供最好的免费插件呢 额外问题 该语言的最佳在线 书籍教程 我不知道它是否是最好的
  • 如何将新的 SomeFunction() 语法转换为 TypeScript?

    当尝试将简单的 JS 文件转换为禁用隐式 any 的 TS 时 出现以下错误 错误 TS7009 新 表达式 缺少构造函数签名 隐式具有 any 类型 interface Logger new any any Callable syntax
  • 为什么在 .NET 4 下运行时此行会导致 VerificationException?

    请帮助我 为什么此代码在 NET 4 0 下运行时会导致 VerificationException public T parseEnum
  • Gemfile - 将生产 gem 与开发 gem 分开

    所以我知道在 Gemfile 中我可以做这样的事情 group development test do gem gem1 gem gem2 end 我想要完成的是这样的事情 group production do gem gem1 gem
  • Xcode动态实时更新折线图

    我正在尝试创建一个折线图 在其中连续绘制数据 以便可以实时观察图表更新 每秒绘制大约 5 个点左右 我正在寻找的图表类似于此处显示的图表 https www vanmil org live heart rate with ios and m
  • 用 typescript 重新定义 window.console

    我的错误记录代码中有以下 javascript 它定义了console log for 某些浏览器不存在 https stackoverflow com questions 3326650 console is undefined erro
  • 如何更改 Java 文件的字体大小和字体颜色?

    如何从 Eclipse 中的 Java 文件而不是 XML 文件更改字体颜色 大小和按钮颜色 对于字体大小 您可以将其写为 tv setTextSize 20 0f 对于字体颜色 您可以将其写为 tv setTextColor Color
  • docker run 使用包含变量的 ENTRYPOINT

    我有一个私人 git 存储库github com http github com我想自动化docker build过程使用Dockerfile 我天真地认为最好的地方Dockerfile位于我的存储库的根文件夹中 例子 git clone
  • 尝试从文件创建 python 字典,但我不断收到“太多值无法解压”之类的错误

    我在记事本中保存了一个文本文件 但移到了我的 python 文件夹中 该文件夹左侧有一个国家 地区的三个字母缩写 右侧有大约四个或五个空格 它有与其对应的国家 地区 如下所示 AFG 阿富汗ARM亚美尼亚 etc 我需要字典使用三个字母作为
  • 如何防止在 Chrome 扩展程序中放大弹出窗口

    我刚刚注意到 如果我在选项卡中放大网页 通过执行 Ctrl Plus 然后打开弹出窗口对于我的 Chrome 扩展 它也得到了扩展 不幸的是 这使得它显示垂直滚动条 在更大的范围内 甚至显示水平滚动条 我发现其他扩展程序仅以 100 缩放显
  • 如何在 FakeHttpContext 中设置 Request.Header 进行单元测试

    我有一个假HttpContext我一直在尝试修改以包含一些用于测试目的的标头 public static HttpContext FakeHttpContext var httpRequest new HttpRequest http st
  • expo-auth-session 无法在 Android 独立应用程序上完成 Google 登录

    我正在使用 expo 开发一个反应本机应用程序 我用过expo auth session providers google包登录 它在世博环境中工作正常 但是当我为 Android 平台构建应用程序时 由于 google 登录未完成 因此不
  • Android - 将点击焦点设置在按钮上

    我的布局中有 4 个按钮 现在每当我单击任何按钮时 在单击事件之后 按钮应该突出显示 显示它是最后单击的 为了制作这样的东西 我尝试了以下方法 code btn1 setOnClickListener new button click li
  • 为什么 std::string("\x00") 报告长度为 0?

    我有一个需要对字符串进行编码的函数 它需要能够接受 0x00 作为有效的 字节 我的程序需要检查字符串的长度 但是如果我传入 x00 to std string the length 方法返回 0 即使字符串是单个空字符 如何获取实际长度
  • Ado.Net - 如何使用连接池?

    Net 允许连接池 根据我所读到的内容 只需向 App config 添加参数即可 问题是 我是否应该在代码中执行任何操作来使用连接池 在我的代码中 每次需要数据时我都会打开一个连接 并在完成后立即关闭它 我应该做一些特别的事情来重用连接吗
  • swing 中的登录和注销[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我制作了一个包含用户名和密码的表单
  • Mininet 找不到所需的可执行控制器

    每当我想在 mininet 中运行 sshd py 示例或我自己编写的一些客户代码时 我都会得到 Creating network Adding controller Adding hosts h1 h2 h3 h4 h5 Adding s
  • 将 TypeScript 类型打印到控制台/文件中

    我有多种类型 形成了当前在我的服务器上使用的更大 复杂的类型 是否可以将更大 复杂的类型打印到控制台 文件中 Example type TypeA prop1 string prop2 number type TypeB Omit