一、JavaScript 和 TypeScript 分别是什么
JavaScript(JS)
- 一种动态类型的脚本语言,最初用于浏览器端开发,现在也可通过 Node.js 运行在服务端。
- 代码在运行时才确定变量类型,类型错误只能在运行时被发现。
- 文件扩展名:
.js
TypeScript(TS)
- 由微软开发,是 JavaScript 的超集(Superset) ,在 JS 的基础上添加了静态类型系统。
- TS 代码不能直接被浏览器或 Node.js 执行,必须先通过 TypeScript 编译器(tsc) 编译成 JS,然后再运行。
- 文件扩展名:
.ts(不含 JSX)、.tsx(含 JSX)
一句话概括:TypeScript = JavaScript + 静态类型系统 + 额外的语法特性
二、核心区别对比
| 对比维度 | JavaScript | TypeScript |
|---|---|---|
| 类型系统 | 动态类型(运行时确定类型) | 静态类型(编译时检查类型) |
| 类型注解 | 不支持 | 支持(如 let name: string = "张三") |
| 编译步骤 | 无需编译,直接运行 | 需要编译为 JS 后才能运行 |
| 错误检测时机 | 运行时才发现类型错误 | 编译阶段就能发现类型错误 |
| 接口(Interface) | 不支持 | 支持 |
| 泛型(Generics) | 不支持 | 支持 |
| 枚举(Enum) | 不支持 | 支持 |
| 类与访问修饰符 | 支持类,但无 public/private/protected |
支持类及完整的访问修饰符 |
| IDE 智能提示 | 有限 | 非常强大(类型推导带来精准提示) |
| 学习成本 | 低 | 相对较高(需理解类型系统) |
| 适用场景 | 小型项目、快速原型 | 中大型项目、团队协作 |
三、.ts 文件可以写 JS 语法代码吗?
可以,完全没问题。
因为 TypeScript 是 JavaScript 的超集,所有合法的 JavaScript 代码都是合法的 TypeScript 代码。
ts
// 这是一个 .ts 文件,但写的是纯 JS 语法
let name = "张三";
let age = 25;
function add(a, b) {
return a + b;
}
const arr = [1, 2, 3];
arr.push(4);
console.log(add(name, age)); // 没有类型注解,TS 会进行类型推导
上面的代码在 .ts 文件中完全合法。TypeScript 编译器会对没有类型注解的变量进行类型推导(Type Inference) ,自动推断出 name 是 string、age 是 number。
💡 即使不写任何类型注解,TS 也能提供一定的类型安全保障。
四、.js 文件可以写 TS 语法的代码吗?
不可以。
.js 文件是 JavaScript 文件,浏览器和 Node.js 的原生运行环境不认识 TypeScript 的语法,直接运行会报错。
错误示例
js
// 这是一个 .js 文件 ❌ 以下 TS 语法会报错
let name: string = "张三"; // SyntaxError: 冒号语法在 JS 中非法
interface User { // SyntaxError: interface 在 JS 中不存在
id: number;
name: string;
}
function add(a: number, b: number): number { // SyntaxError
return a + b;
}
那怎么在 JS 中使用 TS 的类型提示?
虽然 .js 文件不能写 TS 的类型语法,但可以通过 JSDoc 注释 来获得类似的类型提示和检查:
js
// 这是一个 .js 文件 ✅ 使用 JSDoc 实现类型提示
/**
* @param {number} a
* @param {number} b
* @returns {number}
*/
function add(a, b) {
return a + b;
}
/** @type {string} */
let name = "张三";
// 在 VSCode 中,上面这些 JSDoc 注释能提供和 TS 类似的智能提示
此外,Vite/Webpack 等构建工具配合 @ts-check 注释,也可以在 .js 文件中开启类型检查:
js
// @ts-check
let name = "张三";
name = 123; // ❌ 会报错:不能将 number 赋值给 string
五、JS 与 TS 的转换关系
┌─────────────────┐ 编译 (tsc) ┌─────────────────┐
│ .ts 文件 │ ──────────────→ │ .js 文件 │
│ (含类型注解等) │ │ (纯 JavaScript) │
└─────────────────┘ └─────────────────┘
↑ ↑
│ │
所有 JS 代码都可以 浏览器 / Node.js
直接写在 .ts 中 只能运行 .js
- TS → JS :通过
tsc编译器将.ts编译为.js,类型注解会被擦除(Type Erasure),最终输出的 JS 代码中不包含任何类型信息。 - JS → TS :将
.js文件改名为.ts通常可以直接使用,但如果 JS 代码中存在类型不安全的操作,TS 编译器会报错,需要逐步添加类型注解来修复。
六、编译后的代码示例
ts
// 编译前的 .ts 文件
interface User {
id: number;
name: string;
}
function greet(user: User): string {
return `Hello, ${user.name}`;
}
const user: User = { id: 1, name: "张三" };
console.log(greet(user));
js
// 编译后的 .js 文件(类型全部被擦除)
function greet(user) {
return `Hello, ${user.name}`;
}
const user = { id: 1, name: "张三" };
console.log(greet(user));
可以看到,编译后的 JS 代码和手写的 JS 几乎一模一样,类型信息在运行时完全不存在。
七、总结
| 问题 | 答案 |
|---|---|
.ts 文件能写 JS 语法吗? |
✅ 可以,所有 JS 代码都是合法的 TS 代码 |
.js 文件能写 TS 语法吗? |
❌ 不可以,TS 的类型语法在 JS 中会报语法错误 |
想在 .js 中获得类型提示怎么办? |
使用 JSDoc 注释或 // @ts-check |
| TS 代码最终怎么运行? | 必须先通过 tsc 编译成 JS,再交给浏览器或 Node.js 执行 |
| TS 比 JS 好在哪里? | 编译时类型检查、更好的 IDE 提示、更适合大型项目和团队协作 |
| TS 有什么缺点? | 学习成本更高、需要额外的编译步骤、小型项目可能显得"重" |