TS、TSX、JS、JSX 文件扩展名详解

TS、TSX、JS、JSX 文件扩展名详解

📊 一、快速对比表

扩展名 语言 用途 是否可以包含JSX 是否需要编译
.js JavaScript 普通JavaScript文件 ❌ 不能 ❌ 不需要
.jsx JavaScript 包含JSX语法的文件 ✅ 可以 ✅ 需要(Babel等)
.ts TypeScript 普通TypeScript文件 ❌ 不能 ✅ 需要(tsc)
.tsx TypeScript 包含JSX语法的TypeScript文件 ✅ 可以 ✅ 需要(tsc + JSX处理)

🔍 二、详细解析

1. .js 文件 (JavaScript)

javascript 复制代码
// index.js
// 普通JavaScript文件,用于浏览器或Node.js
const name = "John";
const age = 30;

function greet(user) {
  return `Hello, ${user.name}!`;
}

// 模块导出
export { greet };

// 没有JSX语法
// 没有类型注解

特点:

  • 纯 JavaScript 语法
  • 浏览器可直接运行(现代浏览器支持ES6+)
  • 无需编译即可在支持的环境下运行
  • 不能包含 JSX 语法

2. .jsx 文件 (JavaScript + JSX)

javascript 复制代码
// Button.jsx
// React组件,包含JSX语法
import React from 'react';

function Button({ text, onClick }) {
  // ✅ 可以包含JSX
  return (
    <button className="btn" onClick={onClick}>
      {text}
    </button>
  );
}

// JSX编译后变成:
// React.createElement('button', { className: 'btn' }, text)

特点:

  • JavaScript + JSX 语法混合
  • 主要用于 React 组件
  • 需要编译(Babel/Webpack/Vite等)
  • 文件内可以包含 HTML-like 语法
  • 无 TypeScript 类型系统

3. .ts 文件 (TypeScript)

typescript 复制代码
// utils.ts
// 普通TypeScript文件
type User = {
  name: string;
  age: number;
  email?: string;  // 可选属性
};

function createUser(name: string, age: number): User {
  return { name, age };
}

// 泛型示例
function identity<T>(arg: T): T {
  return arg;
}

// 接口示例
interface Config {
  apiUrl: string;
  timeout: number;
}

// ❌ 不能包含JSX语法
// const element = <div>Hello</div>;  // 错误!

特点:

  • TypeScript 语法(类型系统 + ES6+)
  • 需要编译为 JavaScript
  • 不能包含 JSX
  • 用于工具函数、类型定义、配置等

4. .tsx 文件 (TypeScript + JSX)

tsx 复制代码
// UserCard.tsx
// React组件,包含TypeScript类型和JSX
import React, { FC, useState } from 'react';

// 定义组件Props类型
interface UserCardProps {
  user: {
    id: number;
    name: string;
    age: number;
  };
  onEdit: (id: number) => void;
  className?: string;  // 可选属性
}

// 使用FC泛型(Function Component)
const UserCard: FC<UserCardProps> = ({ 
  user, 
  onEdit, 
  className = '' 
}) => {
  const [isActive, setIsActive] = useState<boolean>(false);
  
  // ✅ 可以包含JSX
  return (
    <div className={`user-card ${className}`}>
      <h2>{user.name}</h2>
      <p>Age: {user.age}</p>
      <button onClick={() => onEdit(user.id)}>
        Edit
      </button>
      {isActive && <span>Active</span>}
    </div>
  );
};

export default UserCard;

特点:

  • TypeScript 类型系统 + JSX 语法
  • 主要用于 React 组件开发
  • 编译时需要处理 JSX
  • 提供完整的类型安全

❌ 三、常见错误

错误1:在 .ts 文件中使用 JSX

typescript 复制代码
// utils.ts
// ❌ 错误:.ts文件中不能有JSX
export const element = <div>Hello</div>;

// ✅ 正确:移到 .tsx 文件
// 或:使用工厂函数
export const createElement = (text: string) => {
  return { type: 'div', children: text };
};

错误2:错误配置

json 复制代码
// tsconfig.json
{
  "compilerOptions": {
    "jsx": "react",  // ✅ 正确
    // "allowJs": true,  // 如果需要混合使用
    // "checkJs": true,  // 检查.js文件类型
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.js",    // 如果包含.js
    "src/**/*.jsx"    // 如果包含.jsx
  ]
}

错误3:模块导入

typescript 复制代码
// ❌ 错误:缺少类型声明
import { someFunction } from './some-js-file';

// ✅ 正确:添加类型声明
// some-js-file.d.ts
declare module './some-js-file' {
  export function someFunction(param: string): number;
}

🎯 四、总结与选择指南

决策树

复制代码
新文件是? → 包含JSX? → 是 → 用 .tsx
             │
             └→ 否 → 用 .ts

旧文件是? → .jsx → 逐步迁移到 .tsx
             │
             ├→ .js → 逐步迁移到 .ts
             │
             └→ 配置/脚本 → 保持 .js

一句话总结

  • .js:纯 JavaScript,无需 JSX
  • .jsx:JavaScript + JSX,React组件
  • .ts:TypeScript,无 JSX
  • .tsx:TypeScript + JSX,类型安全的React组件

现代开发推荐 :新项目统一使用 .ts 和 .tsx,享受类型安全带来的开发效率提升。

相关推荐
Wang's Blog3 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
砚底藏山河4 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年4 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym4 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
DongQiShanRen4 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室4 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
持敬chijing5 小时前
白盒测试与代码审计-js登录逆向实战
javascript·网络·安全·web安全·网络安全·网络攻击模型
quantdash_cc5 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
yu_zhidun5 小时前
企业电脑监控软件怎么选:别只看功能清单,先看这 6 个底层能力
开发语言·电脑·php·域智盾系统
无忧.芙桃5 小时前
C++语言原理与实践(十六):多态机制讲解
开发语言·c++·多态