본문으로 건너뛰기

TypeScript

「언어별 가이드」로 돌아가기 · 문서 목록으로


생성되는 것

<Path>/
index.ts 전부 재수출
tables.ts 접근자 — 테이블 게터, readAll, 참조 연결
tables/<Table>.ts 테이블당 하나
enums/<Enum>.ts enum당 하나
constants/<Set>.ts 상수 세트당 하나
tabbit/tcb_reader.ts 바이너리 리더 (함께 생성됩니다)

필요한 것

항목
TypeScript4.5 이상
컴파일 타겟ES2020 이상 — 테이블 리더가 BigInt를 씁니다
런타임Node 또는 브라우저. 테이블 리더 자체는 Uint8Array 위에서만 동작하고 외부 의존성이 없습니다

파일에서 읽는 편의 함수만 Node가 필요합니다. 브라우저에서는 바이트를 직접 넘기세요.

recipe 설정

"Targets": [
{
"Type": "typescript",
"Path": "src/generated",
"AccessorName": "Tables",
"UseStringEnum": false, // true면 enum이 문자열 값을 갖습니다
"Sweep": true,
"TargetSide": "c"
}
]

쓰는 법

두 읽기 경로가 모두 생성됩니다. 배포 상황에 따라 고르고, 두 경로는 같은 값을 냅니다 — 회귀 스위트가 같은 테이블을 양쪽으로 읽어 필드 단위로 비교합니다.

import { Tables } from './generated'

const tables = new Tables()

// JSON에서 — 사람이 들여다보거나 텍스트로 서빙할 때
tables.readAllSync('./data/json')
await tables.readAll('./data/json')

const sword = tables.item.findByIndex(1)
for (const row of tables.item.records) { /* ... */ }
// 바이너리에서 — 크기와 파싱 시간이 중요할 때
tables.readAllBinarySync('./data/binary')

// 테이블 하나만 (참조는 연결되지 않습니다)
tables.item.readBinarySync('./data/binary/Item.tcb')

// 파일 시스템이 없는 환경에서는 바이트를 직접
const bytes = new Uint8Array(await (await fetch(url)).arrayBuffer())
tables.item.readBinaryFrom(bytes)

두 번째 인자로 확장자를 넘길 수 있습니다 (readAll.json, readAllBinarySync는 recipe의 BinaryTableFileExtension).

주의사항

bigint입니다. bigint·datetime·timespannumber가 아니라 BigInt로 나옵니다. JavaScript의 number는 double이라 2^53을 넘는 정수를 실패하지 않고 바꿔서 담기 때문입니다. JSON.stringifyBigInt를 거부하므로 직렬화할 때는 문자열로 바꾸세요.

바이너리 리더는 출력에 자동 포함됩니다. 생성된 테이블이 상대 경로로 import하는데 TypeScript에는 include 경로 개념이 없어 소비자가 다른 곳을 가리킬 방법이 없습니다. 소스는 lib/ts와 공유되는 하나뿐이라 어긋날 수 없습니다.

테이블 하나만 읽으면 참조가 비어 있습니다. 참조 연결은 접근자가 전부 읽은 뒤에 하므로, 참조가 필요하면 readAll / readAllSync / readAllBinarySync를 쓰세요. readBinarySync로 한 테이블만 읽으면 키(_<필드>_<테이블>_index)만 채워집니다.

트러블슈팅

증상원인과 조치
BigInt literals are not available when targeting lower than ES2020tsconfig.jsontargetES2020 이상으로
Do not know how to serialize a BigIntJSON.stringify 전에 String(value)로 바꾸세요
fs 모듈을 찾을 수 없음 (브라우저)readAllSync·readBinarySync는 Node 전용입니다. readBinaryFrom(bytes)를 쓰세요
참조가 undefinedreadAll 대신 테이블 하나만 읽었습니다
JSON과 바이너리 값이 다름버그입니다. 회귀 스위트가 두 경로를 대조하므로, 재현되면 코퍼스에 넣을 값입니다