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 有什么缺点? 学习成本更高、需要额外的编译步骤、小型项目可能显得"重"
相关推荐
kyriewen6 小时前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
山河木马7 小时前
矩阵专题2-怎么创建视图矩阵(uViewMatrix)
javascript·webgl·计算机图形学
tangdou3690986558 小时前
AI真好玩系列-2分钟快速了解DeepAgents | Quick Guide to DeepAgents in 2 Minutes
前端·javascript·后端
张元清8 小时前
React useIntersectionObserver Hook:懒加载与可见性检测(2026)
javascript·react.js
彭于晏爱编程8 小时前
纯 JS + Node,一个下午手搓了能读懂公司代码的 AI 助手,老板以为我转行了
前端·javascript
妙码生花9 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十四):眨眼小人登录页制作
前端·javascript·ai编程
妙码生花9 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十三):前端路由初始化
前端·javascript·ai编程
PBitW10 小时前
GPT训练我的第四天,被打惨了!!!😭😭😭
前端·javascript·面试
DarkLONGLOVE10 小时前
快速上手 Pinia!Vue3 极简状态管理使用教程
javascript·vue.js
mackbob10 小时前
.eslintrc.js详细配置说明
javascript