首页 > 解决方案 > TypeScript 再次结合 *.js + *.d.ts?

问题描述

“compilerOptions”的TypeScript tsc -d“声明”生成相应的“.d.ts”文件。

例如,来自:

tmp.ts

const log = (m: unknown) => {
    console.log((m)); 
    return m;
};

它生成:

tmp.js

const log = (m) => {
    console.log((m));
    return m;
};

和:

tmp.d.ts

declare const log: (m: unknown) => unknown;

我认为这很有趣,因为它将 TypeScript 源代码“划分”为原生 JavaScript 代码和额外的类型定义。

然后,这是我的想法。在划分原生代码和类型定义后,是否可以通过重新绑定两个代码轻松生成有效的 TypeScript 代码。

例如:

tmp-reunion.ts

declare const log1: (m: unknown) => unknown;

const log1 = m => {
    console.log((m)); 
    return m;
};

此代码生成错误:

[ts] Cannot redeclare block-scoped variable 'log1'.

对于每个语句。

我为什么要这样做?

我的动机是事实:

  1. 在代数中,

    (x^2 + 3x +2) = (x+1)(x+2) = (x^2 + 3x +2)

我想确认在 TypeScript 下同样的事情是否有效。

  1. 特别有趣的是,TypeScript 将类型化源代码编译为 vanilla JavaScript 代码,其中类型信息完全丢弃作为输出。

这个事实让我认为,从某种意义上说,vanilla JS 代码的输出对于 TypeScirpt 来说是类型安全且有效的,只是没有 *.d.ts 文件,该文件最终似乎只是 TypeScript 编译器利用的额外帮助功能。它只是一个工具。

因此,普通 JS 代码的类型安全性可以稍后通过 TypeScript 编译器使用辅助功能工具(即tmp.d.ts. 这就是我要确认的。

如何使 TypeScript 再次结合 *.js + *.d.ts?

谢谢。

标签: javascripttypescripttypes

解决方案


因此,普通 JS 代码的类型安全性可以稍后通过 TypeScript 编译器使用辅助功能工具(即tmp.d.ts.

这通常不是真的,因为您在函数体中丢失了任何手动类型注释,这些注释是验证 TypeScript 类型推断功能不足的函数体所需的。对于一个人为的例子(noImplicitAny当然假设):

function duplicateEach<T>(arr: T[]) { 
    let out: T[] = [];
    arr.forEach(t => { out.push(t); out.push(t); });
    return out;
}

如果删除 上的注释out,则代码不会编译,因为 TypeScript 不断发展的数组类型推断不会遍历回调。如果我们查看.d.ts.js,则此注释不会出现在其中任何一个中:

declare function duplicateEach<T>(arr: T[]): T[];

function duplicateEach(arr) {
    var out = [];
    arr.forEach(function (t) { out.push(t); out.push(t); });
    return out;
}

有关更实际的示例,请查看任何重要的 TypeScript 代码库。


推荐阅读