三块面板:TS 源码 / 写死的 tsc 报错样本(非现场运行)/ 可点跑的等价 JS。用一段“纯 JS 原样搬进严格 TS 会报错、但运行时照跑”的代码,把“检查改的是编译期不是运行期”坐实。

一、三个终极结论(速览)

问题回答
TS 是 JS 的超集吗语法上是;但它不加任何运行时能力,只加一层会被擦除的静态类型检查
TS 让程序更快吗不会。跑的是擦除后的 JS;多出的检查是构建期开销,买的是“人”的效率
裸 JS 搬进 TS 一定没事吗不一定。strict 下隐式 any、可能为空直接用等会报错
能混用 / 渐进迁移吗能。.ts 可 import .js(配 allowJs),可逐文件迁移,无需一次转完

二、同一段逻辑:JS 能跑,TS 报错

下面这段在纯 JS 里毫无问题,搬进开了 strict 的 TS 却因为“参数没类型”被拦——错误发生在编辑期,不在运行期。

TS 源码(strict 配置)

function add(a, b) { return a + b }        // noImplicitAny:参数隐式 any
const cfg = { max: 10 }
cfg.max = 20                                // 若 cfg 是 const 对象且 max 只读会报错
console.log(add(1, 2))                       // 运行时完全没问题
cmp.ts:1:14 - error TS7006: Parameter 'a' implicitly has an 'any' type. cmp.ts:1:17 - error TS7006: Parameter 'b' implicitly has an 'any' type.
为什么报:严格配置要求参数有类型。add 没有注解、也无法从上下文推断,noImplicitAny 拦下——而这段 JS 在运行时照样能算出 3。

等价 JS(去掉类型后可真跑)

[迷你控制台]

三、TS 有、JS 完全没有的纯类型语法

: 类型    interface    type X = …    <T> 泛型    enum
as / satisfies / !  断言    declare    import type

四、运行时能力有没有增减?——没有

TS 的全部故事第一章就讲完了:它把「运行时的不确定」变成「编辑时的红波浪线」,代价是多一套工具链和一层要理解的类型规则。

// TS 不提供任何 JS 没有的运行时能力:数组方法、Promise、DOM API 全都来自 JS 宿主
// 加类型改变的是“编译器何时提醒你”,不改变“程序最终怎么跑”
// 渐进采纳:.ts 里能 import 一个 .js(配 allowJs),可逐文件迁移,不必一次转完