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 有什么缺点? 学习成本更高、需要额外的编译步骤、小型项目可能显得"重"
相关推荐
粉末的沉淀1 小时前
vue:Vite项目中高效管理纯色SVG图标的方案
前端·javascript·vue.js
YHHLAI1 小时前
JavaScript 数据结构精讲:数组底层与实战避坑
开发语言·javascript·数据结构
iRayCheung1 小时前
virtualbox安装的ubuntu系统跑numpy报错
linux·ubuntu·numpy
moMo2 小时前
Promise 的本质:不是异步处理,而是流程控制
javascript
dotnet902 小时前
PDF 页面尺寸上限是 14400。iText 直接加载成功的大图可能超过这个限制,需要在 setPageSize 之前等比缩放。
前端·javascript·html
threelab2 小时前
Three.js 几何图形变换 | 三维可视化 / AI 提示词
开发语言·前端·javascript·人工智能·3d·着色器
云水一下2 小时前
TypeScript 从零基础到精通(七):从配置到全栈项目落地
前端·javascript·typescript
丑过三八线2 小时前
Systemd Cgroup 驱动详解
linux·ubuntu·容器
十九画生2 小时前
从同步到异步:重新理解 JavaScript 的执行机制
javascript