tekihei2317 / type-challenges-judge

type-challengesのオンラインジャッジです
https://type-challenges-judge.pages.dev
16 stars 2 forks source link

Promise.all, Simple vue の正誤判定の不具合の解消 #37

Open sankantsu opened 1 year ago

sankantsu commented 1 year ago

Issue #36 の対応です。 Simple vue, Promise.all の各問題で正答とすべき解答が誤答と判定されてしまう問題を解消します。

原因は judge-worker/src/judge.ts 内の compile option および、コンパイルに使用する lib の設定の問題であるようです。

Simple vue

提出例: https://type-challenges-judge.pages.dev/problems/00006-hard-simple-vue/submissions/Di8DlNGTeTpzGFtzkZdi

変更前のソースで judge.ts で出力されるエラーをチェックしたところ、以下のエラーが出ていました。

Unused '@ts-expect-error' directive.
Unused '@ts-expect-error' directive.
Unused '@ts-expect-error' directive.
Cannot find name 'alert'.
Cannot find name 'alert'.
Cannot find name 'alert'.
Type 'false' does not satisfy the constraint 'true'.

この問題では、ユーティリティ型 ThisType を使用しますが、 ThisType を使うためには noImplicitThis flag を有効にしなければならないという記述があります。 https://www.typescriptlang.org/docs/handbook/utility-types.html#thistypetype

judge.ts 内で使用する compile option に noImplicitThis フラグを付加することで、Unused '@ts-expect-error' directive. のエラーが解消されるようです。

Promise.all

提出例: https://type-challenges-judge.pages.dev/problems/00020-medium-promise-all/submissions/HcPTcixM0K98tgJOtLHX

変更前のソースで judge.ts で出力されるエラーをチェックしたところ、以下のエラーが出ていました。

'Promise' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the 'lib' compiler option to es2015 or later.
'Promise' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the 'lib' compiler option to es2015 or later.
Type 'false' does not satisfy the constraint 'true'.
Type 'false' does not satisfy the constraint 'true'.

Promise を値として使うために lib を es2015 以降に変更しなければならないようです。 変更前の状態では、明示的にコピーした es5 の lib を使用する設定になっていますが、compilerHost の設定を変更して明示的な lib の設定を削除することで新しいバージョンの lib が使われるようになり、エラーが解消するようです。 lib のみの変更について方法がわからず、代わりに createCompilerHost でデフォルト設定の compilerHost を作成し、変更したいメソッドだけ書き換えるかたちで実装しています (以下のリンク等を参考にしています)。 https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API#customizing-module-resolution compiler API については全く初めて触ったので、もっと良い書き方があるかもしれません。

テストについては、judge.ts 単体で手元でいくつかの問題サンプルについて試した範囲では問題なさそうでしたが、開発サーバー全体の実行は環境構築ができておらず試していません。

以上、お役に立てば幸いです。