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-重新组合.ts
declare const log1: (m: unknown) => unknown;
const log1 = m => {
console.log((m));
return m;
};
此代码生成错误:
[ts] Cannot redeclare block-scoped variable 'log1'.
对于每个语句。
我为什么要这么做?
我的动机是事实:
在代数中,
(x^2+3x+2(=(x+1((x+2(=
我想确认在TypeScript下同样的东西是否有效。
- 特别有趣的是,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代码库。