私が得ようとしていることを説明するための例は次のとおりです。typescriptでユニオンタイプのフィルターを書く方法
const v1: { type: "S"; payload: string } = { type: "S", payload: "test" };
const v2: { type: "N"; payload: number } = { type: "N", payload: 123 };
type Actions = typeof v1 | typeof v2;
const findByType = <A extends Actions>(type: A["type"]) => (
action: Actions
): action is A => action.type === type;
const filterWithBothNameAndType = [v1, v2].filter(findByType<typeof v1>("S"));
console.log(filterWithBothNameAndType[0].payload.trim());
const findByTypeDoesntWork = <A extends Actions, T extends A["type"]>(type: T) => (
action: Actions
): action is A => action.type === type;
const filterWithJustType = [v1, v2].filter(findByTypeDoesntWork("S"));
console.log(filterWithJustType[0].payload.trim());
私は右のタイプの情報を持っていると私は私が好きなAPIを持っていますが、それは情報を入力失い機能filterWithJustType
を持っている機能findByType
を持っています。私はAPIを汎用型を渡さずにただfilter("S")
にします。これまでのところit looks likeはクラスとinstaceof
でしか動作しませんでしたが、私はそれを普通のオブジェクトで動作させたいと思っていました。
が答えてくれてありがとう。このアプローチの多くの例で出版されたが、私がどのように正確なのActionMapチェックしませんので、コンパイラが好きではありませんI 'v1'の' type'を '' X''に変更することができます。これはコンパイルされますが、ランタイムエラーが返されます。また、ActionMapに ''と書くのは、アクションの数の代わりに 'アクションの数 '*'フィルタの数 'にスケーリングされるので、フィルタに書き込むよりもわずかに優れています。 'findByType'では、それは1つの場所にしかなりません:) bit.ly/runtime-error –
JLarky
はい、それは最適ではないことに同意します - 何らかの理由ですべての可能な' v1..N'型の型定義をActionMap変数を 'v1:ActionMap ['S'] = {...}'と 'v2:ActionMap ['N'] = {..}'として宣言します。意図したユースケースに合っているかどうかは不明です。 – artem