TypeScript ใช้กับ FiveM ได้ไหม? วิธีใช้ TypeScript เขียน FiveM Script

 TypeScript ใช้กับ FiveM ได้ และเป็นตัวเลือกที่ดีมากสำหรับ Developer ที่ต้องการพัฒนา Resource ขนาดกลางถึงใหญ่ โดยเฉพาะคนที่มีพื้นฐาน JavaScript, Node.js หรือ Web Development อยู่แล้ว

อย่างไรก็ตาม สิ่งสำคัญที่ต้องเข้าใจก่อนคือ FiveM ไม่มี TypeScript Runtime แยกต่างหาก

กระบวนการทำงานโดยทั่วไปคือ

TypeScript
↓
Compile / Build
↓
JavaScript
↓
FiveM JavaScript Runtime

ดังนั้น TypeScript จะช่วยตรวจ Type, แนะนำ Function, ตรวจ Error บางประเภทก่อน Run และทำให้ Project ขนาดใหญ่ดูแลง่ายขึ้น แต่สุดท้าย Code ที่ FiveM ทำงานจริงยังเป็น JavaScript

บทความนี้จะอธิบายว่า TypeScript FiveM คืออะไร ใช้อย่างไร ต้องติดตั้งอะไร ตั้งค่า Project อย่างไร และเหมาะกับใครเมื่อเทียบกับ JavaScript และ Lua

① TypeScript คืออะไร

TypeScript เป็นภาษาที่พัฒนาต่อยอดจาก JavaScript

แนวคิดง่าย ๆ คือ

JavaScript
+
Type System
+
Developer Tooling
=
TypeScript

ตัวอย่าง JavaScript

const money = 5000;

TypeScript สามารถระบุ Type ได้

const money: number = 5000;

หรือ

const playerName: string = 'John';
const isAdmin: boolean = false;

TypeScript สามารถตรวจ Code ก่อน Compile และช่วยจับข้อผิดพลาดบางอย่างตั้งแต่ Development Time

② TypeScript ใช้กับ FiveM ได้จริงหรือไม่

ได้

เอกสาร Cfx.re มี TypeScript Definition สำหรับ FiveM JavaScript API และแนะนำ Official NPM Packages ได้แก่

@citizenfx/client
@citizenfx/server

สำหรับ Type Definitions และ Auto Completion

ดังนั้น Developer สามารถเขียน

client.ts
server.ts

จากนั้น Compile เป็น

client.js
server.js

แล้วให้ FiveM โหลด JavaScript ที่ Build แล้ว

③ TypeScript เป็นภาษาที่ FiveM รองรับโดยตรงหรือไม่

ต้องแยกคำว่า “ใช้ได้” กับ “Runtime โดยตรง” ออกจากกัน

FiveM มี Scripting Runtime หลัก เช่น

Lua
JavaScript
C#

แต่ TypeScript ไม่ใช่ Runtime เพิ่มอีกตัวหนึ่ง

FiveM ไม่ได้อ่านข้อความ

client.ts

แล้วรันเหมือน JavaScript โดยอัตโนมัติใน Workflow ปกติ

โดยทั่วไปต้องทำ

client.ts
↓
TypeScript Compiler / Bundler
↓
client.js
↓
FiveM

ดังนั้นถ้ามีคนถามว่า

FiveM เขียน TypeScript ได้ไหม

คำตอบคือ

ได้ แต่ต้อง Build เป็น JavaScript ก่อน

④ ทำไม FiveM Developer ถึงใช้ TypeScript

ข้อดีสำคัญที่สุดคือ Type Safety

สมมติ JavaScript มี Function

function giveMoney(amount) {
    return amount + 100;
}

ถ้าเผลอส่ง String

giveMoney('500');

JavaScript อาจยังทำงานต่อและได้ผลลัพธ์ที่ไม่ตรงกับสิ่งที่ต้องการ

TypeScript สามารถกำหนดว่า

function giveMoney(amount: number): number {
    return amount + 100;
}

ถ้าเรียก

giveMoney('500');

TypeScript จะเตือนตั้งแต่ก่อน Build

สำหรับ Resource ขนาดใหญ่ การจับ Error ก่อน Runtime มีประโยชน์มาก

⑤ TypeScript ช่วย FiveM Project อย่างไร

TypeScript ช่วยด้าน

  • Type Checking

  • Auto Completion

  • Refactoring

  • Function Signature

  • Interface

  • Object Structure

  • Event Data

  • Export Type

  • Callback Type

  • Database Result

  • Project Maintenance

โดยเฉพาะเมื่อ Resource มี Code หลายพันบรรทัด

Type ที่ชัดเจนช่วยให้ Developer รู้ว่าข้อมูลแต่ละตัวควรมีรูปแบบอย่างไร

⑥ ตัวอย่าง Object FiveM แบบ TypeScript

สมมติเรามี Player Data

JavaScript อาจเขียน

const player = {
    id: 1,
    name: 'John',
    job: 'police',
    money: 5000
};

TypeScript สามารถสร้าง Interface ได้

interface PlayerData {
    id: number;
    name: string;
    job: string;
    money: number;
}

จากนั้น

const player: PlayerData = {
    id: 1,
    name: 'John',
    job: 'police',
    money: 5000
};

ถ้าใส่ผิด เช่น

money: '5000'

TypeScript สามารถเตือนได้ก่อนนำ Script ไป Run

⑦ TypeScript เหมาะกับ FiveM Resource ใหญ่หรือไม่

เหมาะมาก

โดยเฉพาะ Resource ที่มี

Client
Server
Shared Types
Database
NUI
Exports
Events
Callbacks

จำนวนมาก

ตัวอย่าง Project อาจมี

my_resource/
├── src/
│   ├── client/
│   │   └── index.ts
│   ├── server/
│   │   └── index.ts
│   └── shared/
│       └── types.ts
├── dist/
│   ├── client.js
│   └── server.js
├── package.json
├── tsconfig.json
└── fxmanifest.lua

Developer เขียน Code ใน src

แล้ว Build ออกไปที่ dist

จากนั้น FiveM โหลดไฟล์ใน dist

⑧ ต้องติดตั้งอะไรเพื่อใช้ TypeScript กับ FiveM

สำหรับ Project พื้นฐานควรมี

  • Node.js

  • npm

  • TypeScript

  • Visual Studio Code

  • FiveM Type Definitions

เริ่มจากสร้าง Project

npm init -y

จากนั้นติดตั้ง TypeScript

npm install --save-dev typescript

หากเขียน Client FiveM สามารถติดตั้ง

npm install --save-dev @citizenfx/client

หากเขียน Server

npm install --save-dev @citizenfx/server

หรือใช้ทั้งสอง Package หาก Project มีทั้ง Client และ Server

⑨ @citizenfx/client คืออะไร

@citizenfx/client เป็น Official NPM Package สำหรับ Type Definitions ฝั่ง Client ของ FiveM

ช่วยให้ Editor รู้จัก Function เช่น

PlayerPedId();
GetEntityCoords(...);
RegisterCommand(...);

และ API ที่เกี่ยวข้อง

ข้อดีคือเวลาเขียนใน Visual Studio Code จะได้

  • Auto Completion

  • Parameter Hint

  • Type Hint

  • ตรวจชื่อ Function

  • ลด Typo

ซึ่งช่วยให้เขียน FiveM Script ได้เร็วขึ้น

⑩ @citizenfx/server คืออะไร

@citizenfx/server ใช้สำหรับ Type Definitions ฝั่ง Server

เช่น API ที่เกี่ยวข้องกับ

  • Server Events

  • Commands

  • Exports

  • Server Natives

  • Runtime Functions

ตัวอย่างติดตั้ง

npm install --save-dev @citizenfx/server

จากนั้น TypeScript Project สามารถใช้ Definition เหล่านี้ในการตรวจ Code

⑪ วิธีสร้าง tsconfig.json

หลังติดตั้ง TypeScript สามารถสร้าง Config ด้วย

npx tsc --init

จะได้ไฟล์

tsconfig.json

ตัวอย่าง Configuration แบบพื้นฐาน

{
  "compilerOptions": {
    "target": "ES2017",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true
  },
  "include": [
    "src/**/*.ts"
  ]
}

นี่เป็นเพียงตัวอย่างเริ่มต้น

Project จริงอาจใช้ Build Tool หรือ Module Format แตกต่างกัน

ควรตั้งค่าตาม Architecture ของ Resource

⑫ target ES2017 คืออะไร

เอกสาร Cfx.re ระบุว่า FiveM JavaScript Runtime มี ES2017 Standard Library ใน Client Runtime

ดังนั้น Developer ควรพิจารณา Target JavaScript ให้เข้ากับ Runtime ที่ Resource จะทำงาน

ตัวอย่าง

"target": "ES2017"

ช่วยให้ TypeScript Compile Syntax ให้เหมาะกับ Environment มากขึ้น

แต่ถ้าใช้ Bundler เช่น esbuild หรือเครื่องมืออื่น ต้องตรวจ Configuration ของ Bundler เพิ่มเติมด้วย

⑬ สร้าง TypeScript FiveM Resource ตัวแรก

สมมติสร้าง Folder

ts_example/

โครงสร้าง

ts_example/
├── src/
│   └── client.ts
├── dist/
├── fxmanifest.lua
├── package.json
└── tsconfig.json

ใน

src/client.ts

เขียน

console.log('TypeScript FiveM started');

จากนั้น Build

npx tsc

จะได้ไฟล์ JavaScript ใน

dist/

เช่น

dist/client.js

FiveM จะโหลดไฟล์นี้แทน .ts

⑭ วิธีเขียน fxmanifest.lua สำหรับ TypeScript FiveM

fxmanifest.lua ไม่จำเป็นต้องรู้ว่า Source Code เดิมเป็น TypeScript

เพราะ FiveM โหลด JavaScript ที่ Build แล้ว

ตัวอย่าง

fx_version 'cerulean'
game 'gta5'

author 'Your Name'
description 'FiveM TypeScript Example'
version '1.0.0'

client_script 'dist/client.js'

Flow คือ

src/client.ts
↓
Build
↓
dist/client.js
↓
fxmanifest.lua
↓
FiveM JavaScript Runtime

นี่คือหลักสำคัญของ TypeScript FiveM

⑮ วิธีสร้าง Command FiveM ด้วย TypeScript

ใน client.ts

RegisterCommand('hello', () => {
    console.log('Hello from TypeScript!');
}, false);

Compile แล้ว FiveM จะรัน JavaScript ที่ได้จาก Code นี้

สามารถเพิ่ม Parameter ได้ เช่น

RegisterCommand(
    'hello',
    (_source: number, args: string[]) => {
        const name = args[0];

        if (name) {
            console.log(`Hello ${name}`);
        }
    },
    false
);

TypeScript ทำให้เราระบุได้ว่า

source → number
args → string[]

ช่วยให้เข้าใจ Code ได้ชัดเจนขึ้น

⑯ วิธีใช้ Native ด้วย TypeScript

สามารถเรียก FiveM Native ได้เหมือน JavaScript

ตัวอย่าง

const ped = PlayerPedId();
const coords = GetEntityCoords(ped);

console.log(coords);

หรือ

RegisterCommand('coords', () => {
    const ped = PlayerPedId();
    const coords = GetEntityCoords(ped);

    console.log(coords);
}, false);

Type Definitions จาก Cfx.re จะช่วยให้ Editor รู้จัก Native เหล่านี้

⑰ Type ของ Coordinates ใน JavaScript FiveM เป็นอย่างไร

ตรงนี้ต้องระวัง เพราะ JavaScript Runtime และ Lua CfxLua จัดการ Vector ต่างกันในหลายกรณี

ใน JavaScript Native บางตัวอาจคืนค่าที่ Represent เป็น Array หรือ Type ตาม Definition ของ FiveM

ดังนั้นอย่า Copy Lua Code เช่น

coords.x

มาแปลงเป็น JavaScript แบบตรง ๆ โดยไม่ตรวจ Type Definition

ควรดู Type จาก Editor และ Native Documentation ก่อน

นี่เป็นหนึ่งในข้อดีของ TypeScript เพราะจะช่วยบอกว่า Return Value มี Structure แบบใด

⑱ TypeScript Client Script กับ Server Script ต่างกันอย่างไร

เหมือน JavaScript FiveM

Client TypeScript เมื่อ Compile แล้วจะรันใน

FiveM Client JavaScript Runtime

Server TypeScript จะ Compile แล้วรันใน

FiveM Server JavaScript Runtime

ดังนั้น Environment ต่างกัน

Client

เหมาะกับ

  • Player

  • Vehicle

  • Ped

  • Marker

  • Camera

  • Control

  • NUI

Server

เหมาะกับ

  • Player Validation

  • Database

  • Permission

  • Server Logic

  • Security

  • Events

อย่าใช้ API Client ใน Server เพียงเพราะ TypeScript Compile ผ่าน

Runtime Context ยังสำคัญเหมือนเดิม

⑲ วิธีแยก Client และ Server Types

Project ใหญ่ควรแยก Folder ชัดเจน

ตัวอย่าง

src/
├── client/
│   └── index.ts
├── server/
│   └── index.ts
└── shared/
    └── types.ts

shared/types.ts อาจมี

export interface PlayerJob {
    name: string;
    grade: number;
}

จากนั้นทั้ง Client และ Server สามารถ Import Type เดียวกันมาใช้

ช่วยลดปัญหา Data Structure ไม่ตรงกัน

⑳ Event FiveM ใช้ TypeScript ได้ไหม

ได้

ตัวอย่าง Client

RegisterCommand('testserver', () => {
    emitNet('example:hello', 'John');
}, false);

Server

onNet('example:hello', (name: string) => {
    console.log(`Hello ${name}`);
});

TypeScript ช่วยระบุว่า Parameter ที่คาดหวังคือ

name: string

แต่มีเรื่องสำคัญมาก:

TypeScript ไม่ได้ Validate Network Data ตอน Runtime

㉑ TypeScript ป้องกัน Hacker ส่งข้อมูลผิด Type ได้ไหม

ไม่ได้โดยอัตโนมัติ

นี่เป็นจุดที่ FiveM Developer ต้องเข้าใจให้ชัด

สมมติ Server เขียน

onNet('shop:buy', (amount: number) => {
    // ...
});

การเขียน

amount: number

ไม่ได้หมายความว่า Client ที่ไม่ปลอดภัยจะส่ง String, Object หรือค่าผิดปกติเข้ามาไม่ได้

TypeScript Type หายไปหลัง Compile

ดังนั้น Server ยังต้องตรวจ Runtime Data เช่น

onNet('shop:buy', (amount: unknown) => {
    if (typeof amount !== 'number') {
        return;
    }

    if (!Number.isFinite(amount)) {
        return;
    }

    if (amount <= 0) {
        return;
    }

    // Server logic
});

นี่สำคัญมากสำหรับ FiveM Security

㉒ TypeScript Type หายไปไหนหลัง Compile

TypeScript Type ส่วนใหญ่มีไว้ตอน Development

เช่น

const money: number = 5000;

หลัง Compile อาจกลายเป็น JavaScript ประมาณ

const money = 5000;

: number ไม่ได้อยู่ใน Runtime

ดังนั้น TypeScript ช่วย Developer ป้องกัน Bug แต่ไม่ใช่ Runtime Security System

㉓ ควร Validate Event Data อย่างไร

Network Event ทุกตัวที่รับข้อมูลจาก Client ควรถือว่า Input อาจไม่น่าเชื่อถือ

ตัวอย่าง

onNet(
    'shop:buy',
    (itemName: unknown, amount: unknown) => {
        if (typeof itemName !== 'string') {
            return;
        }

        if (
            typeof amount !== 'number' ||
            !Number.isInteger(amount) ||
            amount < 1 ||
            amount > 100
        ) {
            return;
        }

        // ตรวจ Player
        // ตรวจ Item
        // ตรวจราคา
        // ตรวจเงิน
        // แล้วจึงซื้อ
    }
);

TypeScript กับ Server Validation ควรใช้ร่วมกัน

ไม่ใช่เลือกอย่างใดอย่างหนึ่ง

㉔ ใช้ Interface กับ Event Data ได้อย่างไร

สมมติเรามี

interface BuyItemData {
    item: string;
    amount: number;
}

สามารถใช้เป็น Type ภายใน Code ได้

แต่ถ้าข้อมูลมาจาก Client ยังต้อง Validate ก่อน Cast

ไม่ควรเขียน

const data = clientData as BuyItemData;

แล้วเชื่อทันทีว่า Data ถูกต้อง

as เป็นเพียงการบอก TypeScript ว่า Developer เชื่อว่า Type นี้ถูกต้อง

มันไม่ได้เปลี่ยนหรือ Validate Object จริง

㉕ TypeScript ใช้ Library Validation ได้ไหม

ได้

Project ขนาดใหญ่อาจใช้ Runtime Validation Library เพื่อ Validate Data

แนวคิดคือ

Client Data
↓
Runtime Schema Validation
↓
Type-safe Data
↓
Business Logic

แต่ต้องตรวจว่า Library นั้นเหมาะกับ Runtime และ Bundle Size ของ Resource

สำหรับระบบเล็ก การตรวจด้วย

typeof
Array.isArray()
Number.isInteger()

อาจเพียงพอ

ไม่จำเป็นต้องเพิ่ม Dependency จำนวนมากทุก Project

㉖ TypeScript FiveM ใช้ Export ได้ไหม

ได้

ตัวอย่าง

exports('getPrice', (): number => {
    return 500;
});

Resource อื่นสามารถเรียก Export ตาม API ของ JavaScript Runtime

ข้อดีของ TypeScript คือสามารถสร้าง Type ของ Export ได้

Cfx.re มี Interface ชื่อ

CitizenExports

ที่สามารถ Extend เพื่อเพิ่ม Type ของ Custom Export ได้

㉗ CitizenExports คืออะไร

FiveM JavaScript Type Definitions มี Generic Interface สำหรับ Export

Developer สามารถ Extend เช่น

declare global {
    interface CitizenExports {
        my_resource: {
            getPrice(): number;
        };
    }
}

export {};

จากนั้นเมื่อเรียก Export ใน Project ที่ตั้งค่า Type ถูกต้อง Editor สามารถรู้ว่า

getPrice()

คืนค่า number

ช่วยให้ Resource หลายตัวเชื่อมกันได้ปลอดภัยขึ้นในระดับ Compile Time

㉘ TypeScript ใช้กับ Callback ได้ไหม

ได้

โดยเฉพาะถ้า Framework หรือ Library มี Callback API

สามารถกำหนด Return Type เช่น

interface PlayerData {
    name: string;
    money: number;
}

แล้ว Function ที่คืนข้อมูล

async function getPlayerData(): Promise<PlayerData> {
    return {
        name: 'John',
        money: 5000
    };
}

TypeScript ช่วยให้ Developer รู้ว่า Promise เมื่อ Resolve แล้วจะได้ข้อมูลรูปแบบใด

เรื่องนี้มีประโยชน์มากกับ Database และ Async Code

㉙ async await ใช้กับ FiveM TypeScript ได้ไหม

ได้ เพราะหลัง Compile เป็น JavaScript Runtime สามารถใช้ Pattern ที่ JavaScript Environment รองรับได้

ตัวอย่าง

async function loadData(): Promise<void> {
    const result = await someAsyncFunction();

    console.log(result);
}

แต่ต้องเข้าใจว่า Async ไม่ได้ทำให้ Code ทุกอย่างเร็วขึ้น

และ Server Node.js Runtime มีข้อควรระวังเรื่อง Thread Affinity หาก Callback จาก Node API จะเรียก CitizenFX Server Native

㉚ TypeScript Server ใช้ Node.js ได้ไหม

ได้ หลัง Compile เป็น JavaScript

FiveM Server JavaScript Runtime ปัจจุบันมี Customized Node.js Runtime

ดังนั้นสามารถใช้ Node API หรือ Package ที่รองรับได้

เช่น

import fs from 'fs';

หรือขึ้นกับ Module Configuration อาจใช้ require

const fs = require('fs');

แต่ต้องตรวจ

  • Module Format

  • TypeScript Config

  • Node Version

  • FiveM Runtime

  • Package Compatibility

ให้ตรงกัน

㉛ FiveM TypeScript ใช้ Node.js 22 ได้ไหม

ฝั่ง Server สามารถเลือก Node.js 22 ได้ผ่าน Resource Manifest

ตัวอย่าง

node_version '22'

เช่น

fx_version 'cerulean'
game 'gta5'

node_version '22'

server_script 'dist/server.js'

Cfx.re ระบุว่า Server JavaScript Runtime ค่าเริ่มต้นยังเป็น Node.js 16 และมี Node.js 22 ให้เลือก

ถ้า Package ต้องใช้ Node รุ่นใหม่จึงค่อยพิจารณาเปิด

㉜ TypeScript ใช้ npm Package ได้ไหม

ได้ใน Workflow ที่เหมาะสม โดยเฉพาะฝั่ง Server

สามารถติดตั้ง Package ผ่าน npm

npm install package-name

แต่ต้องระวังว่า Package บางตัวอาจ

  • ต้องใช้ Node Version ใหม่

  • พึ่ง Native Binary

  • ใช้ API ที่ FiveM ไม่มี

  • เหมาะกับ Browser เท่านั้น

  • เพิ่ม Resource Size มาก

อย่าติดตั้ง Package เพียงเพราะมี Function ที่เขียนเองได้ไม่กี่บรรทัด

Dependency ทุกตัวเพิ่มภาระในการ Maintain

㉝ TypeScript Client ใช้ Node.js API ได้ไหม

ไม่ได้เหมือน Server

FiveM Client JavaScript Runtime ไม่มี Node.js-specific API ทั่วไป

ดังนั้น Code TypeScript ฝั่ง Client ต่อให้ Editor Compile ผ่าน ก็ไม่ควรสมมติว่าใช้

fs
path
process

แบบ Node.js Server ได้ทั้งหมด

ต้องแยก Environment

Client
≠
Server Node Runtime

เหมือน JavaScript FiveM ปกติ

㉞ TypeScript Client ใช้ document ได้ไหม

ไม่ได้ใน Client Script ปกติ

ตัวอย่าง

document.getElementById('menu');

ต้องใช้ใน NUI Browser Context

ไม่ใช่

src/client/index.ts

ที่รันใน FiveM Client Runtime

ถ้าต้องทำ UI ควรแยก Project หรือ Folder สำหรับ NUI

㉟ TypeScript ใช้สร้าง NUI ได้ไหม

ได้ และเหมาะมาก

ตัวอย่าง Structure

src/
├── client/
│   └── index.ts
├── server/
│   └── index.ts
└── nui/
    └── app.ts

NUI TypeScript จะ Build เป็น JavaScript สำหรับ Browser

ส่วน Client/Server TypeScript Build สำหรับ FiveM Runtime

แม้ทั้งหมดเป็น TypeScript แต่ Target Environment ต่างกัน

ต้องกำหนด Build Config ให้เหมาะสม

㊱ TypeScript ใช้กับ React FiveM ได้ไหม

ได้ใน NUI

ตัวอย่าง

React + TypeScript
↓
Build
↓
HTML / CSS / JavaScript
↓
FiveM NUI

นี่เป็น Stack ที่เหมาะกับ UI ขนาดใหญ่ เช่น

  • Phone

  • Inventory

  • MDT

  • Admin Panel

  • Character Creator

  • Banking

แต่ถ้า UI มีเพียงเมนูง่าย ๆ ไม่จำเป็นต้องใช้ React

เลือก Tool ให้เหมาะกับความซับซ้อนของ Project

㊲ TypeScript ใช้กับ Vue หรือ Svelte ได้ไหม

ได้ในหลักการเดียวกัน

สามารถใช้

Vue + TypeScript
Svelte + TypeScript
React + TypeScript

แล้ว Build เป็น Static Web Assets สำหรับ NUI

แต่ต้องกำหนด ui_page และ files ใน fxmanifest.lua ให้ถูกต้อง

Framework Front-end ไม่ได้เปลี่ยนหลักการสื่อสารระหว่าง NUI กับ FiveM Client

㊳ TypeScript ใช้กับ Database FiveM ได้ไหม

ได้

ตัวอย่าง Server TypeScript

TypeScript
↓
Compile
↓
JavaScript Server
↓
Database Library
↓
MySQL / MariaDB

TypeScript มีประโยชน์มากกับ Database เพราะสามารถสร้าง Interface ให้ Row ที่ Query กลับมา

ตัวอย่าง

interface UserRow {
    id: number;
    identifier: string;
    money: number;
}

จากนั้น Function อาจกำหนด Return Type

async function getUser(): Promise<UserRow | null> {
    // query
    return null;
}

ช่วยลดความสับสนเรื่อง Column และ Data Structure

㊴ TypeScript ใช้กับ oxmysql ได้ไหม

ได้หากใช้ API และ Version ที่รองรับ JavaScript

แนวคิดคือ

Server TypeScript
↓
Build
↓
Server JavaScript
↓
oxmysql
↓
MySQL / MariaDB

ควรตรวจ Documentation ของ oxmysql Version ที่ใช้งานจริง เพราะ Export และ Typing อาจแตกต่างกันตาม Version

อย่าอาศัยตัวอย่างเก่าหลายปีโดยไม่ตรวจ API ปัจจุบัน

㊵ TypeScript ใช้กับ ESX ได้ไหม

ได้ในระดับ Integration ของ Resource แต่ต้องดู API ของ ESX และ Resource ที่ใช้อยู่

เนื่องจาก Ecosystem ของ ESX มี Lua Resource จำนวนมาก การรู้ Lua ยังมีประโยชน์สำหรับการแก้ Script ที่มีอยู่

แต่ Resource Custom สามารถเขียนด้วย TypeScript แล้วสื่อสารกับ ESX ผ่าน

  • Event

  • Export

  • Callback

  • Network Event

ตาม API ที่ Framework เปิดไว้

㊶ TypeScript ใช้กับ QBCore ได้ไหม

ได้เช่นกันในหลักการเดียวกัน

FiveM ไม่ได้บังคับให้ Resource ทุกตัวใน QBCore Server ต้องเป็น Lua

แต่ Developer ต้องเข้าใจว่า API ของ Framework เป็นอย่างไร

ตัวอย่าง Architecture

TypeScript Resource
↓
FiveM Event / Export
↓
QBCore
↓
Server Logic

ถ้าต้องแก้ Resource QBCore ที่เขียน Lua โดยตรง ก็ยังต้องอ่าน Lua ให้ได้

㊷ TypeScript ใช้กับ Qbox ได้ไหม

ได้ หาก Integration API รองรับ

สิ่งสำคัญคือแยก

Programming Language

ออกจาก

Framework

TypeScript/JavaScript เป็นภาษาที่ใช้สร้าง Resource

ส่วน Qbox เป็น Framework อีก Layer หนึ่ง

ดังนั้น Resource TypeScript สามารถสื่อสารกับ Framework ผ่าน API ที่มีได้

㊸ TypeScript กับ JavaScript FiveM ต่างกันอย่างไร

หัวข้อJavaScriptTypeScript
FiveM รันโดยตรง✅❌ ต้อง Build
Type Checkingจำกัด✅
Auto Completionดีดีมาก
Interfaceไม่มี Type Interface✅
Compile Stepไม่จำเป็น✅
Project เล็กง่ายอาจเกินจำเป็น
Project ใหญ่ดีดีมาก
Refactoringดีดีมาก
RuntimeJavaScriptJavaScript หลัง Build

TypeScript เพิ่มขั้นตอน Build แต่แลกกับ Developer Experience ที่ดีขึ้น

㊹ TypeScript กับ Lua FiveM เลือกอะไรดี

ถ้าไม่เคย Programming มาก่อน

Lua มักเริ่มต้นง่ายกว่า

ถ้าเป็น JavaScript Developer อยู่แล้ว

TypeScript เป็นตัวเลือกที่น่าสนใจมาก

ถ้าทำ Project ใหญ่และต้องการ Type Safety

TypeScript ได้เปรียบ

ถ้าต้องแก้ Community Script ของ ESX/QBCore จำนวนมาก

Lua ยังเป็นภาษาที่ควรรู้

จึงไม่มีคำตอบว่าภาษาไหนดีที่สุดสำหรับทุกคน

㊺ TypeScript ทำให้ FiveM Script เร็วขึ้นไหม

ไม่โดยอัตโนมัติ

หลัง Build TypeScript กลายเป็น JavaScript

Performance จริงจึงขึ้นกับ

  • JavaScript ที่ Output

  • Algorithm

  • Tick

  • Loop

  • Native Calls

  • Event Frequency

  • Network

  • Database

  • NUI

TypeScript ช่วย Code Quality มากกว่าช่วย FPS หรือ Resmon โดยตรง

㊻ TypeScript ทำให้ Resmon ลดลงไหม

ไม่

ถ้าเขียน

setTick(() => {
    // งานหนักทุก Tick
});

Resource ก็สามารถกิน CPU สูงได้เหมือน JavaScript ปกติ

TypeScript ไม่ Optimize FiveM Game Logic ให้อัตโนมัติ

Developer ยังต้องใช้

  • Resource Monitor

  • Profiler

  • Cache

  • Event-driven Design

  • Interval ที่เหมาะสม

เพื่อ Optimize

㊼ Error TypeScript FiveM ที่พบบ่อย

Cannot find name PlayerPedId

มักเกี่ยวกับ Type Definitions หรือ TypeScript Configuration

ตรวจว่าได้ติดตั้ง

@citizenfx/client

และกำหนด Types ถูกต้องหรือไม่

Cannot find name emitNet

อาจเกิดจาก Typing ของ FiveM Runtime ไม่ถูกโหลด

FiveM หาไฟล์ไม่เจอ

มัก Build Output Path ไม่ตรงกับ fxmanifest.lua

เช่น Manifest ใช้

dist/client.js

แต่ Build ไปที่

build/client.js

TypeScript Compile ผ่านแต่ Runtime Error

Type Checking ไม่สามารถป้องกัน Runtime Error ทุกประเภทได้

ต้องดู Client/Server Console ต่อ

Cannot find module

อาจเกี่ยวกับ

  • Node Module

  • Build Tool

  • Module Format

  • Server Runtime

  • Package ไม่ถูก Bundle

㊽ วิธี Debug TypeScript FiveM

ต้อง Debug สองระดับ

ระดับ TypeScript

ดู Error จาก Compiler

npx tsc

ตัวอย่าง

Type 'string' is not assignable to type 'number'

แก้ก่อน Build

ระดับ FiveM Runtime

หลัง Build แล้วดู

  • F8 Console

  • Server Console

  • Stack Trace

  • Resource Error

เพราะ Error บางประเภทเกิดตอน Runtime เท่านั้น

㊾ Source Map มีประโยชน์ไหม

มีประโยชน์สำหรับ Project ที่ Build หรือ Bundle TypeScript

Source Map ช่วยเชื่อม JavaScript ที่ Compile แล้วกลับไปยัง Source TypeScript

ทำให้ Stack Trace และ Debugging เข้าใจง่ายขึ้น

แต่ต้องตั้งค่า Toolchain ให้เหมาะสมและพิจารณาว่าต้องการแจก Source Map บน Production หรือไม่

Project ขนาดเล็กอาจยังไม่จำเป็นต้องตั้งระบบซับซ้อน

㊿ ควรใช้ tsc หรือ Bundler

ขึ้นอยู่กับ Project

ใช้ tsc

เหมาะกับ Project ที่

  • Structure ง่าย

  • Dependency ไม่ซับซ้อน

  • ไม่ต้อง Bundle

  • ต้องการเริ่มต้นเร็ว

ใช้ Bundler

เช่น esbuild หรือ Tool อื่น เหมาะเมื่อ

  • มี Module จำนวนมาก

  • ใช้ npm Packages

  • ต้อง Bundle Dependency

  • ต้อง Minify

  • ต้องสร้างหลาย Target

ไม่มี Tool เดียวที่ดีที่สุดสำหรับทุก Resource

51 วิธี Build TypeScript FiveM แบบง่าย

ใน package.json

สามารถมี Script เช่น

{
  "scripts": {
    "build": "tsc"
  }
}

จากนั้นใช้

npm run build

Flow จะเป็น

แก้ .ts
↓
npm run build
↓
ได้ .js
↓
restart resource
↓
ทดสอบ

นี่เป็น Workflow พื้นฐานที่เข้าใจง่าย

52 ทำ Watch Mode ได้ไหม

ได้

TypeScript Compiler มี Watch Mode เช่น

npx tsc --watch

เมื่อแก้ .ts จะ Compile ใหม่อัตโนมัติ

Developer จึงสามารถใช้ Workflow

แก้ TypeScript
↓
Auto Build
↓
restart Resource
↓
ทดสอบ

ช่วยลดเวลา Development

แต่ FiveM ไม่ได้ Restart Resource ให้อัตโนมัติเพียงเพราะ Build ไฟล์ใหม่

53 ควรแยก Shared Types หรือไม่

ถ้า Project เริ่มใหญ่ ควรแยก

ตัวอย่าง

shared/
├── player.ts
├── events.ts
├── items.ts
└── jobs.ts

เช่น

export interface Item {
    name: string;
    label: string;
    price: number;
}

Client และ Server สามารถใช้ Type เดียวกันได้

ข้อดีคือเมื่อเปลี่ยน Structure Developer จะเห็น Error ในจุดที่ต้องแก้ได้เร็วขึ้น

54 ควรสร้าง Event Type หรือไม่

Project ใหญ่สามารถกำหนด Event Contract

ตัวอย่าง

interface BuyItemPayload {
    item: string;
    amount: number;
}

ช่วยให้ Client และ Server รู้ว่าข้อมูลควรมีโครงสร้างอะไร

แต่ยังต้องจำว่า

Network Payload ต้อง Validate ตอน Runtime เสมอ

TypeScript Contract เป็นเพียง Compile-time Agreement

55 TypeScript เหมาะกับทีม Developer หรือไม่

เหมาะมาก

โดยเฉพาะทีมที่มีหลายคนแก้ Code เดียวกัน

Type ช่วยให้ Developer ใหม่เข้าใจว่า

Function รับอะไร
Function คืนอะไร
Object มี Field อะไร
Event ต้องส่งอะไร
Database คืนอะไร

โดยไม่ต้องไล่อ่าน Implementation ทุกบรรทัด

ใน Project ระยะยาว สิ่งนี้ช่วยลดต้นทุนการ Maintain ได้มาก

56 มือใหม่ควรเริ่ม TypeScript FiveM เลยไหม

ถ้ายังไม่เคยเขียน Programming เลย ผมแนะนำให้เรียน JavaScript หรือพื้นฐาน Programming ก่อนเล็กน้อย

ควรเข้าใจ

Variable
Function
Array
Object
if
Loop
Promise
async/await

จากนั้นจึงเพิ่ม TypeScript

เพราะถ้าเรียนพร้อมกันทั้ง

JavaScript
TypeScript
FiveM
Node.js
NUI

ตั้งแต่วันแรก อาจมี Concept ซ้อนกันมากเกินไป

57 Roadmap TypeScript FiveM

แนะนำลำดับนี้

JavaScript พื้นฐาน
↓
TypeScript พื้นฐาน
↓
FiveM Resource
↓
fxmanifest.lua
↓
Client Script
↓
Server Script
↓
Native
↓
Event
↓
Runtime Validation
↓
Export
↓
Database
↓
NUI
↓
Security
↓
Optimization

ถ้ามีพื้นฐาน JavaScript อยู่แล้วสามารถเริ่ม TypeScript + FiveM ได้เร็วมาก

58 Project สำหรับฝึก TypeScript FiveM

เริ่มตามนี้ได้

Project 1

สร้าง Command /hello

Project 2

แสดง Coordinates

Project 3

สร้าง Typed Config

Project 4

Client → Server Event

Project 5

สร้าง Event Payload Interface

Project 6

Validate Event Server-side

Project 7

สร้าง Export พร้อม Typing

Project 8

เชื่อม Database

Project 9

สร้าง NUI

Project 10

สร้าง Resource เต็มรูปแบบ

เมื่อทำครบจะเข้าใจทั้ง TypeScript และ FiveM Architecture มากขึ้น

59 ข้อดีและข้อเสียของ TypeScript FiveM

ข้อดี

  • Type Safety

  • Auto Completion ดี

  • Refactor ง่าย

  • Project ใหญ่ดูแลง่าย

  • ลด Typo

  • Event/Data Structure ชัด

  • เหมาะกับ Team

  • ใช้ร่วมกับ npm Ecosystem ได้ดี

ข้อเสีย

  • ต้องมี Build Step

  • Setup มากกว่า Lua/JavaScript ธรรมดา

  • Runtime Error ยังเกิดได้

  • ต้องเข้าใจ JavaScript ด้วย

  • Config ผิดอาจทำให้ Build ซับซ้อน

  • มือใหม่อาจเจอ Type Error กับ Runtime Error พร้อมกัน

ดังนั้นควรเลือกตามขนาด Project และพื้นฐานของ Developer

60 TypeScript FiveM เหมาะกับใครที่สุด

TypeScript เหมาะมากกับ

  • JavaScript Developer

  • Node.js Developer

  • Web Developer

  • Full-stack Developer

  • ทีมพัฒนา FiveM

  • Resource ขนาดใหญ่

  • ระบบที่มี Event จำนวนมาก

  • Resource ที่มี Database

  • NUI ขนาดใหญ่

  • Project ที่ต้อง Maintain ระยะยาว

ถ้าเพียงทดลอง Command 10 บรรทัด JavaScript ธรรมดาก็เพียงพอ

แต่ถ้ากำลังสร้างระบบหลายหมื่นบรรทัด TypeScript สามารถช่วยได้มาก

คำถามที่พบบ่อยเกี่ยวกับ TypeScript FiveM

TypeScript ใช้กับ FiveM ได้ไหม

ได้ โดย Compile หรือ Bundle เป็น JavaScript ก่อนให้ FiveM JavaScript Runtime ทำงาน

FiveM รันไฟล์ .ts โดยตรงไหม

Workflow ปกติไม่ใช่ TypeScript Runtime โดยตรง ควร Build .ts เป็น .js

FiveM มี Type Definitions หรือไม่

มี และ Cfx.re แนะนำ Official Packages @citizenfx/client และ @citizenfx/server

TypeScript ใช้ Client Script ได้ไหม

ได้ หลัง Compile เป็น JavaScript สำหรับ FiveM Client Runtime

TypeScript ใช้ Server Script ได้ไหม

ได้ และสามารถใช้ Node.js APIs/Packages ตามข้อจำกัดของ Server JavaScript Runtime

TypeScript ใช้ NUI ได้ไหม

ได้ และสามารถใช้กับ React, Vue, Svelte หรือ Vanilla TypeScript ได้

TypeScript ป้องกัน Exploit ได้ไหม

ไม่โดยอัตโนมัติ Type จะหายไปหลัง Compile และ Network Data ยังต้อง Validate ฝั่ง Server

TypeScript ทำให้ Script เร็วกว่า JavaScript ไหม

ไม่โดยอัตโนมัติ เพราะ Code ที่ Runtime ทำงานจริงคือ JavaScript

TypeScript หรือ Lua อะไรดีกว่า

ถ้าเป็นมือใหม่ Lua เริ่มง่ายกว่า แต่ถ้ามีพื้นฐาน JavaScript หรือทำ Project ใหญ่ TypeScript มีข้อดีด้าน Type Safety และ Maintainability

สรุป TypeScript ใช้กับ FiveM ได้ไหม

TypeScript ใช้กับ FiveM ได้เต็มที่ในฐานะ Development Language ที่ Compile เป็น JavaScript ก่อนนำไปรันบน FiveM JavaScript Runtime

โครงสร้างที่ควรจำคือ

TypeScript
↓
Compile / Bundle
↓
JavaScript
↓
FiveM Client / Server Runtime

Cfx.re มี Official Type Definitions ผ่าน

@citizenfx/client
@citizenfx/server

ทำให้ Visual Studio Code และ Editor อื่นสามารถช่วยตรวจ FiveM API, Native และ Function ได้ดีขึ้น

TypeScript เหมาะอย่างมากกับ Resource ขนาดใหญ่ เพราะช่วยจัดการ Interface, Event Payload, Database Result, Export และ Shared Data Structure ได้เป็นระบบ

แต่สำหรับผู้ที่เรียน FiveM กับ comsiam ต้องจำไว้ว่า TypeScript ไม่ได้แทนที่ความรู้ JavaScript, Client/Server, Networking หรือ Security และ Type Annotation ไม่สามารถป้องกัน Client ส่งข้อมูลอันตรายได้

เมื่อใช้ TypeScript ร่วมกับ Runtime Validation, Server-side Security, Database Design และ FiveM Architecture ที่ถูกต้อง คุณจะสามารถสร้าง Resource ที่ดูแลง่ายและขยายต่อได้ดีกว่า Project ที่ไม่มี Structure และเนื้อหาใน comsiam จะพาไปต่อในหัวข้อถัดไปคือ C# สำหรับ FiveM ซึ่งเป็นอีกหนึ่ง Runtime อย่างเป็นทางการของ FiveM

Comments

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด