私は誰かが私の下のタイプで見つからないものを識別するのを助けることを望んでいます。 match
という関数を作成しました。この関数は、特定されたときに一致する関数を実行するタプル の配列をとります。たとえば:Flowtypeの統一タイプを防ぐにはどうすればいいですか?
type Fn1<A, B> = (a: A, ...rest: empty[]) => B;
declare export function match<A>(
xs: Array<[Class<A>, (x: A) => mixed]>,
...rest: empty[]
): Fn1<A, mixed>;
describe('match',() => {
class FileExists {}
class FileDoesNotExist {}
let matcher: (x: FileExists | FileDoesNotExist) => mixed;
beforeEach(() => {
const whenFileExists = [FileExists, (x: FileExists) => x];
const whenFileDoesNotExist = [FileDoesNotExist, (x: FileDoesNotExist) => x];
matcher = match([whenFileExists, whenFileDoesNotExist]);
});
it('should return an instance of whenFileDoesNotExist',() => {
// Should invoke the function in the tuple containing the FileDoesNotExist class
expect(matcher(new FileDoesNotExist()) instanceof FileDoesNotExist).toBe(true);
});
});
問題は種類が統一されていることのようです。私は次のエラーを取得しています:
`` `
1406:みましょうマッチャー:(X:FILEEXISTS | FileDoesNotExist)=>混合します; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileDoesNotExist。このタイプは、予想されるパラメータタイプ 1409と互換性がありません:const whenFileExists = [FileExists、(x:FileExists)=> x]; ^^^^^^^^^^ FILEEXISTS
テスト/ fp.test.js:1406 1406:せマッチャ:(X:FILEEXISTS | FileDoesNotExist)=>混合。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileExists。 (X:FileDoesNotExist)=> X ^^^^^^^^^^^^^^^^ FileDoesNotExist
テスト/ fp.test.jsこのタイプ 1412予想PARAMタイプと互換性がありません:1409 1409:const whenFileExists = [FileExists、(x:FileExists)=> x]; ^^^^^^^^^ FileExists。 (X:FileDoesNotExist)=> X ^^^^^^^^^^^^^^^^ FileDoesNotExist
テスト/ fp.test.jsこのタイプ 1412予想PARAMタイプと互換性がありません:1409 1409:const whenFileExists = [FileExists、(x:FileExists)=> x]; ^ FileExists。 (X:FileDoesNotExist)=> X ^^^^^^^^^^^^^^^^ FileDoesNotExist
テスト/ fp.test.jsこのタイプ 1412予想PARAMタイプと互換性がありません:1411 1411:FileDoesNotExist、 ^^^^^^^^^^^^^^^^ FileDoesNotExist。このタイプは、予想されるパラメータタイプ 1409と互換性がありません:const whenFileExists = [FileExists、(x:FileExists)=> x]; ^^^^^^^^^^ FILEEXISTS
テスト/ fp.test.js:1412 1412:(X:FileDoesNotExist)=> X ^ FileDoesNotExist。このタイプは、予想されるパラメータタイプ 1409と互換性がありません:const whenFileExists = [FileExists、(x:FileExists)=> x]; ^^^^^^^^^^ FILEEXISTS
`` `私はここに欠けているかを把握することはできません。誰かが私が外に出ているか忘れている何かを見ますか?
こんにちはPeterさん、詳細な応答をいただきありがとうございます。実在型は、フローが使用されている実際の型を推測できるように見える。これは、私が見ているエラーを削除しますが、残念ながら、私は意図的に追加するエラーをキャッチすることはできません。たとえば、私が[FileExists、(x:{id:number})=> x]のようにしたとします。上記の場合、 'x'はオブジェクトではなくFileExistsのインスタンスでなければならないので、エラーが発生すると思います。しかし、流れはこれを拾うようには見えません。 –
さて、それは迷惑です。私が考えることができる唯一の他の解決策(あなたが望むものではないかもしれない)は、 'FileExists'と' FileDoesNotExist'の共通基底クラスを作ることです。次に、ラムダの引数型として基本クラスを使用できます。 '*'型を取り除いて、 'A'型のパラメータを元の場所に戻すこともできます。 –
Peterの説明にもう一度感謝します。私たちはこの作業を行う方法を考え出しましたが、それは最も理想的ではありません(上記の記事を参照)。興味がある場合は、Flowtype githubページで問題を作成しました:https://github.com/facebook/flow/issues/3393 –