JavaScript、TypeScript、JSX、TSX 教學

一、簡介

在現代前端開發中,JavaScript(簡稱 JS)與其超集合 TypeScript(簡稱 TS)是最常用的程式語言,而 JSX/TSX 則為了讓開發者更便利地在 React 中撰寫元件而誕生的語法擴充。本篇文章將分別介紹這四者的概念、特性與範例,幫助你快速上手。


二、JavaScript(.js)

1. 什麼是 JavaScript?

  • 定義:一種動態、直譯式、弱型別的程式語言,主要在瀏覽器端執行,也可用於伺服器端(如 Node.js)。

  • 特性

    • 動態型別:變數在執行時才決定型別。

    • 單執行緒:採用事件回呼與非同步機制(Promise、async/await)來處理 I/O。

    • 原型繼承:透過物件的 prototype 屬性實現繼承。

2. 基本語法範例

// 宣告變數
let name = 'Samuel';
const PI = 3.14159;

// 函式宣告
function greet(person) {
  console.log(`Hello, ${person}!`);
}

// 非同步函式
async function fetchData(url) {
  try {
    const response = await fetch(url);
    const data = await response.json();
    return data;
  } catch (err) {
    console.error(err);
  }
}

// 使用範例
greet(name);

三、TypeScript(.ts)

1. 什麼是 TypeScript?

  • 定義:由 Microsoft 開發的 JavaScript 超集合,加入靜態型別檢查與最新 ECMAScript 功能編譯支援,最終編譯成純 JavaScript。

  • 特性

    • 靜態型別:可在編譯時捕捉型別錯誤,提升開發穩定度。

    • 介面(Interface)與型別別名(Type Alias):定義物件結構與複雜型別。

    • 豐富的編譯選項:可針對不同環境與 ECMAScript 目標做調整。

2. 設定與編譯

# 安裝 TypeScript
npm install -g typescript

# 產生 tsconfig.json(預設設定檔)
tsc --init

# 編譯所有 .ts 檔案
tsc

3. 型別範例

// 定義介面
interface User {
  id: number;
  name: string;
  isAdmin?: boolean;  // 可選屬性
}

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

// 使用範例
const user: User = { id: 1, name: 'Alice' };
const num = identity<number>(42);

四、JSX(.jsx)

1. 什麼是 JSX?

  • 定義:JavaScript XML 的縮寫,是一種語法擴充,讓開發者在 JavaScript 檔案中書寫類似 HTML 的標記,用以描述 UI 元件結構。

  • 使用場景:主要用於 React 開發,可讓標記與行為更緊密結合。

2. JSX 語法特性

  • 標籤必須閉合:即使是單一元素也要自閉合 <img />

  • 屬性命名:採用駝峰式(camelCase),例如 classNameonClick

  • 表達式插值:使用大括號 {} 包裹 JavaScript 表達式。

3. 範例

import React from 'react';

function Hello({ name }) {
  return (
    <div className="greeting">
      <h1>Hello, {name}!</h1>
      <p>現在時間:{new Date().toLocaleTimeString()}</p>
    </div>
  );
}

export default Hello;

五、TSX(.tsx)

1. 什麼是 TSX?

  • 定義:TypeScript 版本的 JSX,副檔名為 .tsx。在 TS 檔案中使用 JSX 語法,就必須用 .tsx 作為副檔名才能正確編譯。

  • 差異

    • 必須搭配 TypeScript 編譯器。

    • 可以在 JSX 標籤內直接使用已型別檢查的變數與介面。

2. TSX 範例

import React from 'react';

// 定義 Props 型別
interface HelloProps {
  name: string;
}

const Hello: React.FC<HelloProps> = ({ name }) => {
  return (
    <div>
      <h1>Hello, {name}!</h1>
    </div>
  );
};

export default Hello;

六、整合範例:React + TypeScript

// src/App.tsx
import React, { useState, useEffect } from 'react';

interface ClockProps {
  locale?: string;
}

const Clock: React.FC<ClockProps> = ({ locale = 'zh-TW' }) => {
  const [time, setTime] = useState<string>(
    new Date().toLocaleTimeString(locale)
  );

  useEffect(() => {
    const timer = setInterval(() => {
      setTime(new Date().toLocaleTimeString(locale));
    }, 1000);
    return () => clearInterval(timer);
  }, [locale]);

  return <div>目前時間:{time}</div>;
};

export default function App() {
  return (
    <div>
      <h2>React + TypeScript 範例</h2>
      <Clock />
    </div>
  );
}
  1. 建立專案

    npx create-react-app my-app --template typescript
    cd my-app
    npm start
    
  2. 新增元件:將上述 ClockApp 置於 src/ 即可。


七、總結

  • JavaScript:動態、弱型別,網頁互動的基礎語言。

  • TypeScript:為 JavaScript 增加靜態型別檢查,提高大型專案的維護性與穩定性。

  • JSX:讓你在 JavaScript 中以類 HTML 語法撰寫 UI,最常見於 React。

  • TSX:結合 TypeScript 與 JSX 的語法副檔名,用於型別安全的 React 開發。

<
文章標籤
全站熱搜
創作者介紹
創作者 liusming 的頭像
liusming

劉老師的跨域創想工坊

liusming 發表在 痞客邦 留言(0) 人氣(98)