TypeScript tsc -d
对“ compilerOptions”的“声明”会生成相应的“ .d.ts”文件。
例如,来自:
const log = (m: unknown) => {
console.log((m));
return m;
};
它生成:
const log = (m) => {
console.log((m));
return m;
};
和:
declare const log: (m: unknown) => unknown;
我认为这很有趣,因为它将TypeScript源代码“划分”为本地JavaScript代码和额外的类型定义。
然后,这是我的想法。在指定了本机代码和类型定义之后,是否很容易通过重新绑定两个代码来生成有效的TypeScript代码。
例如:
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)=(x ^ 2 + 3x +2)
我想确认在TypeScript下是否同样有效。
从某种意义上说,事实使我认为,使用TypeScirpt时,纯净的JS代码的输出是安全且有效的类型,只是没有* .d.ts文件,该文件最终似乎只是TypeScript编译器需要的额外辅助功能优势。这只是一个工具。
因此,以后可以通过TypeScript编译器使用辅助功能工具tmp.d.ts
轻松验证香草JS代码的类型安全性。这就是我要确认的。
我该如何做 TypeScript再次结合* .js + * .d.ts吗?
谢谢。
答案 0 :(得分:2)
因此,以后可以通过TypeScript编译器使用辅助功能工具
tmp.d.ts
轻松地验证香草JS代码的类型安全性。
通常这是不正确的,因为您已经丢失了用于验证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代码库。