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 有什么缺点? 学习成本更高、需要额外的编译步骤、小型项目可能显得"重"
相关推荐
Dovis(誓平步青云)2 分钟前
拍视频前先把镜头想清楚:做一个分镜取景辅助器
android·java·服务器·javascript·人工智能
2601_962071571 小时前
Java进阶(vue基础)
前端·javascript·vue.js
研☆香1 小时前
数组方法 splice讲解 拓展
开发语言·前端·javascript
————A1 小时前
Agent 文件处理中间件
开发语言·javascript·ecmascript
ITresearchGuest2 小时前
LangChain JS 入门:快速搭建前端 AI 开发环境
前端·javascript·langchain
YHHLAI2 小时前
React + TypeScript 实战:从零构建颜色选择器应用
前端·react.js·typescript
小磊哥er2 小时前
深入解构Claude Code - 第 1 篇 · 先认识它
javascript·ai编程
雪芽蓝域zzs2 小时前
第十节:动态侧边栏菜单(根据路由 meta 自动渲染菜单)
javascript·vue.js·elementui
feilieren3 小时前
ubuntu 安装 docker
linux·ubuntu·docker
ttwuai3 小时前
Go 后台管理系统组件库文档怎么写,才不会坑后续维护?
开发语言·javascript·golang