TypeScript再次组合*.js+*.d.ts


"compilerOptions"的TypeScripttsc -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-重新组合.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(=

我想确认在TypeScript下同样的东西是否有效。

  1. 特别有趣的是,TypeScript将一个类型化的源代码编译为一个普通的JavaScript代码,并将类型信息完全丢弃作为输出

这一事实让我认为,从某种意义上说,普通JS代码的输出在使用TypeScirpt时是类型安全有效的,只是没有*.d.ts文件,而*.d.ts最终看起来只是TypeScript编译器利用的一个额外的辅助功能。这只是一个工具。

因此,普通JS代码的类型安全性可以稍后通过TypeScript编译器和辅助函数工具tmp.d.ts进行验证。这就是我想确认的。

我该怎么做TypeScript再次组合*.js+*.d.ts

谢谢。

因此,普通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代码库。

相关内容

  • 没有找到相关文章

最新更新