ほとんど miyabi-sun の回答で良いと思いますが、2つほど気になったことがありました。
isAvaiableFile
の戻り値が指定されていない
isAvaiableFile
関数ですが、戻り値が指定されていないため、このままだとエラーが発生すると思います。
typescript
1const isAvaiableFile = (file:string):any=>{
2 return new Promise(...)
3}
と書くか、
typescript
1const isAvaiableFile = (file:string):any=>( // {} ではなく、 () を使う
2 new Promise(...)
3)
と書く必要があります。
解説すると、アロー関数は下記の通り書くことができます。
javascript
1// Pattern1 (基本的な書き方)
2const func1 = (arg1, arg2) => {
3 // 関数の処理
4 ...
5 return result // 結果を返却。書かないと戻り値はundefinedになる
6}
7
8// Pattern2 (関数の処理が1行で済むのであれば、{}とreturnを省略して書くことができる)
9const func2 = (arg1, arg2) => arg1 + arg2
10
11// Pattern3 (引数が1つの場合、引数の括弧は省略できる
12const func3 = arg => {
13 ...
14}
15
16// Pattern4 2と3の組み合わせ
17const func4 = arg => 2 * arg
18
19// NGパターン
20const funcNG = arg => return arg // pattern2, 4の書き方でreturnをつけると構文エラーになります
先ほどの例のうち、括弧が{}
の方はPattern1の書き方なのでreturn
が必要です。一方で、括弧が()
となっているのはPattern2の書き方と同等になります。よって()
の時はreturn
を省略して書きます。
アロー関数について、詳しくはこちらを参照するといいと思います。
readdirSync
ではなく readdir
ではないですか?
readdirSync
はSync
となっている通り、同期処理をする時に使う関数なので、そもそもPromiseにする必要はないですね。非同期処理にするのであれば、readdir
関数を使うべきですね。
長々と、しかも質問の回答と少しずれた回答になって恐縮ですが、これら2つを踏まえてisAvaiableFileを書き換えるとこんな感じかなと思います。
typescript
1// 戻り値はPromise<T>となります。TはPromiseで渡す値の型が入ります。
2// なので、今回はPromise<boolean>になるのが正しいです。
3const isAvaiableFile = (file: string): Promise<boolean> => {
4 // 豆知識ですが、コールバック関数に無名関数を渡す場合、TypeScriptの型推論が
5 // 行われるので型の指定はしなくても大丈夫です。
6 // もしエラーが出るようならおそらく型定義がインストールされていないと思います。
7 return new Promise((resolve, reject) => {
8 fs.readdir(__dirname + "/../data", (err, files) => {
9 if (err) { // readdirに失敗した時
10 reject(err)
11 return
12 }
13 resolve(files.some((v:any) => v === file))
14 })
15 })
16}
17
18// もし同期処理でOKならこうかけます。ただし、同期処理はパフォーマンスに関する注意が必要です。
19const isAvaiableFileSync = (file: string): boolean => {
20 const files = fs.readdirSync(__dirname + "/../data")
21 return files.some((v => v === file))
22}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。