三块面板:TS 源码 / 写死的 tsc 报错样本(非现场运行)/ 可点跑的等价 JS。用一段“纯 JS 原样搬进严格 TS 会报错、但运行时照跑”的代码,把“检查改的是编译期不是运行期”坐实。
| 问题 | 回答 |
|---|---|
| TS 是 JS 的超集吗 | 语法上是;但它不加任何运行时能力,只加一层会被擦除的静态类型检查 |
| TS 让程序更快吗 | 不会。跑的是擦除后的 JS;多出的检查是构建期开销,买的是“人”的效率 |
| 裸 JS 搬进 TS 一定没事吗 | 不一定。strict 下隐式 any、可能为空直接用等会报错 |
| 能混用 / 渐进迁移吗 | 能。.ts 可 import .js(配 allowJs),可逐文件迁移,无需一次转完 |
下面这段在纯 JS 里毫无问题,搬进开了 strict 的 TS 却因为“参数没类型”被拦——错误发生在编辑期,不在运行期。
function add(a, b) { return a + b } // noImplicitAny:参数隐式 any
const cfg = { max: 10 }
cfg.max = 20 // 若 cfg 是 const 对象且 max 只读会报错
console.log(add(1, 2)) // 运行时完全没问题
add 没有注解、也无法从上下文推断,noImplicitAny 拦下——而这段 JS 在运行时照样能算出 3。: 类型 interface type X = … <T> 泛型 enum
as / satisfies / ! 断言 declare import type
TS 的全部故事第一章就讲完了:它把「运行时的不确定」变成「编辑时的红波浪线」,代价是多一套工具链和一层要理解的类型规则。
// TS 不提供任何 JS 没有的运行时能力:数组方法、Promise、DOM API 全都来自 JS 宿主
// 加类型改变的是“编译器何时提醒你”,不改变“程序最终怎么跑”
// 渐进采纳:.ts 里能 import 一个 .js(配 allowJs),可逐文件迁移,不必一次转完