Closed6
ts-nodeは最近のnodeでは動かないしtsxが今の流行りだし明日からnodeでtypescriptが動く
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
ので、簡単な動かし方を探してみた
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
調べるとこれが出てきた
「替わりに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
...
という訳で
今どきはts-nodeは捨ててtsxを使う べし
…なんだけど とりあえず動かす
方法があっという間に陳腐化するのは結構きついねぇ…
…と思ってたら
明日リリースのnode v3.6からはnodeでそのままtypescript実行できる みたい orz
とはいえどちらも型チェックをしてくれないので、ちょっと不便そうではある
けど とりあえず動かしてみる
がやりやすくなるのは良いのでは
ちなみに 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にクローズされました