三块面板:TS 源码 / 写死的 tsc 报错样本(非现场运行)/ 可点跑的等价 JS。核心看 any 与 unknown 的分工。

一、unknown 不能乱用,必须先收窄

TS 源码

function report(v: unknown) {
  v.toUpperCase()        // ✗ unknown 上什么都不许直接做
  const s: string = v    // ✗ unknown 不能直接赋给 string
  if (typeof v === 'string') {
    return v.length      // ✓ 收窄后才能用
  }
  return 0
}

tsc 类型检查(输出样本,非现场运行)

report.ts:2:5 - error TS2571: Object is of type 'unknown'. report.ts:3:9 - error TS2322: Type 'unknown' is not assignable to type 'string'. 3 const s: string = v ~~~~~~
为什么报:unknown 是「类型安全的任意值」。编译器不让你在没证明它是什么之前调用方法或赋值——这道闸正是 any 会给你的自由的反面。

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

[迷你控制台]

二、any:让编译器闭嘴,也让你失去保护

function loose(v: any) {
  return v.whatever.youWant   // 合法!any 上不检查任何成员
}

三、never:穷尽后不可能到达