Closed6

ts-nodeは最近のnodeでは動かないしtsxが今の流行りだし明日からnodeでtypescriptが動く

konk303konk303

typescriptでfizzbuzzを書いてみたんだけど、nodeがそのままでは喰ってくれなかった

% node -v
v23.5.0
% node ./fizzbuzz.ts
/Users/kim/src/dev/ts/fizzbuzz.ts:1
const fizzbuzz = (i: number) => {
                   ^

SyntaxError: Unexpected token ':'
    at wrapSafe (node:internal/modules/cjs/loader:1671:18)
    at Module._compile (node:internal/modules/cjs/loader:1714:20)
    at Object..js (node:internal/modules/cjs/loader:1905:10)
    at Module.load (node:internal/modules/cjs/loader:1474:32)
    at Function._load (node:internal/modules/cjs/loader:1286:12)
    at TracingChannel.traceSync (node:diagnostics_channel:322:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:234:24)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:151:5)
    at node:internal/main/run_main_module:33:47

Node.js v23.5.0
[1]    21489 exit 1     node ./fizzbuzz.ts

ので、簡単な動かし方を探してみた

konk303konk303

typescript node 実行 でググると、 npm i typescript ts-node すれば良いとあるのでやってみた
…あれ?動かない

% npx i typescript ts-node
...
% npx ts-node ./fizzbuzz.ts
TypeError: Unknown file extension ".ts" for /Users/kim/src/dev/ts/fizzbuzz.ts
    at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:183:9)
    at defaultGetFormat (node:internal/modules/esm/get_format:209:36)
    at defaultLoad (node:internal/modules/esm/load:116:22)
    at async ModuleLoader.loadAndTranslate (node:internal/modules/esm/loader:488:32)
    at async ModuleJob._link (node:internal/modules/esm/module_job:115:19) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
[1]    26326 exit 1     npx ts-node ./fizzbuzz.ts
konk303konk303

調べるとこれが出てきた
https://github.com/TypeStrong/ts-node/issues/1997
動かせなくはなさそうだけど、なんか大変そう…
「替わりにtsx を使う」が今どきの解決法っぽい
(型チェックをしてくれないんだけど、動くことはあっさり動く)
ts-node自体も2年間コミットがないようなので、使わないほうが良さそう

% npm uninstall ts-node
% npm i tsx
% npx tsx ./fizzbuzz.ts
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
...
konk303konk303

という訳で
今どきはts-nodeは捨ててtsxを使う べし

…なんだけど とりあえず動かす 方法があっという間に陳腐化するのは結構きついねぇ…

konk303konk303

…と思ってたら
https://github.com/nodejs/node/pull/56450

明日リリースのnode v3.6からはnodeでそのままtypescript実行できる みたい orz

とはいえどちらも型チェックをしてくれないので、ちょっと不便そうではある
けど とりあえず動かしてみる がやりやすくなるのは良いのでは

konk303konk303

ちなみに fizzbuzz.ts

const fizzbuzz = (i: number) => {
    if (i % 3 === 0 && i % 5 === 0) {
        console.log('fizzbuzz')
    } else if (i % 3 === 0) {
        console.log('fizz')
    } else if (i % 5 === 0) {
        console.log('buzz')
    } else {
        console.log(i)
    }
}

for (let i = 0; i <= 100; i++) {
    fizzbuzz(i)
}
このスクラップは2025/01/06にクローズされました