実現したいこと
関数の引数を特定の値のみに制限したいです。
例えば"A","B","C"の3つの値のみを引数に取る関数を作りたいと考えています。
ただし、引数はコマンドライン引数から受け取ります。
考えたこと
typescript
1import * as commander from 'commander'; 2 3type abc = "A" | "B" | "C" 4 5const func = (arg : abc) => { 6 console.log(arg); 7} 8 9commander 10 .version("0.1.0", "-v, --version") 11 .arguments("<arg>") 12 .action(func)
として、node test.js D
とすれば、
InvalidArgumentErrorになるのかなと考えましたが、
普通に console.log("D")されてしまいます。
考えたこと(その2)
一度、間に代入の処理を挟めばいいのだ! と考えて、
以下のコードを書きましたが、トランスパイル時に型が保証されているのか、エラーになりませんでした。
typescript
1type abc = "A" | "B" | "C" 2 3const func = (arg : abc) => { 4 const argABC : abc = arg; 5 console.log(argABC); 6}
考えたこと(その3)
列挙型にしてみる。
typescript
1type enum abc{ 2 "A" = "A", 3 "B" = "B", 4 "C" = "C", 5}; 6 7const func = (arg : abc) => { 8 console.log(argABC); 9}
これも普通に console.log("D") されてしまいます。。。
最終的に、、、
結局、以下のように型ではなく配列で対応しましたが、、、
型で制御する方法は無いでしょうか。。。
typescript
1const abc: string[] = [ "A", "B", "C"]; 2 3const func = (arg : abc) => { 4 if(abc.indexOf(arg) < 0) 5 throw new Error( `Unknown argument '${arg}' is not found.`); 6 console.log(arg); 7}
https://wandbox.org/permlink/P9CWeHDTgcD6Ev1A
> prog.ts(7,6): error TS2345: Argument of type '"D"' is not assignable to parameter of type 'abc'.
エラーになりますね。
回答を頂いたmaisumakun様の回答にも書きましたが、
引数をコマンドライン引数から受け取っているという条件を記載しておりませんでした。
修正依頼ありがとうございます。
列挙型使えばいけませんかね?
列挙型なら、コンパイル後も違う形で比較生きる・・・と信じたいですね。
実は、列挙型にした後、Unionを試しておりまして^^;
駄目でした。。
試したことは全て質問文に記載してください。
大変失礼いたしました。いまさらですが、質問文編集し、その旨追記いたしました。
回答1件
あなたの回答
tips
プレビュー