JavaScript 和 TypeScript 分别是什么,可以相互写吗


一、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) ,自动推断出 namestringagenumber

💡 即使不写任何类型注解,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 有什么缺点? 学习成本更高、需要额外的编译步骤、小型项目可能显得"重"
相关推荐
前端甜糖34 分钟前
记录We码开发者工具的一个bug
前端·javascript
猫3281 小时前
echarts 日常问题解决
前端·javascript·echarts
晓说前端1 小时前
TypeScript 核心语法进阶 —— 字面量类型与类型推论
前端·typescript
不简说2 小时前
JS 代码技巧 vol.8 — 20 个函数式编程实战,把 if/else 拍扁的骚操作
前端·javascript·面试
Cobyte2 小时前
模板 DSL 解析器中的状态机设计
前端·javascript·vue.js
suaizai_3 小时前
TypeScript 7 正式发布!Vue 暂被 “拒之门外“ !!!
linux·运维·ubuntu
软件开发技术深度爱好者4 小时前
小学英语单词魔法学园HTML5实现
javascript·html5·英语学习
勉灬之4 小时前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
糖果店的幽灵4 小时前
langgraph分支之 - 动态分支(Dynamic Branch)
java·前端·javascript·人工智能·langgraph
这是个栗子4 小时前
前端开发中的常用工具函数(九)
开发语言·javascript·ecmascript·at