javascript - 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'.
对于每个语句。
我为什么要这样做?
我的动机是事实:
在代数中,
(x^2 + 3x +2) = (x+1)(x+2) = (x^2 + 3x +2)
我想确认在 TypeScript 下同样的事情是否有效。
- 特别有趣的是,TypeScript 将类型化源代码编译为 vanilla JavaScript 代码,其中类型信息完全丢弃作为输出。
这个事实让我认为,从某种意义上说,vanilla JS 代码的输出对于 TypeScirpt 来说是类型安全且有效的,只是没有 *.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 代码库。
推荐阅读
- python - 如何使用 Python 在不丢失数据的情况下最好地查询 AWS 表?
- arrays - 从最左列开始沿对角线遍历矩阵
- spring-boot - Spring Boot JPA 获取父子节点
- python - 如何将 conda 包添加到 docker compose celery?
- discord.py - 是否可以在代码中更改 discord.py 机器人名称的颜色?
- owl - OWL 不相交的元素集
- web - 是否有分析服务可以为应用程序中的不同用户提供分析和统计信息?
- python - kivymd:AttributeError:“超级”对象没有属性“__getattr__”
- php - PHP Cookie 未分配给全局数组
- javascript - 需要将数据从产品页面获取到购物车作为滑块侧面板,并让 mysql 数据库数据显示我的字段