export interface Action{
type: string;
}
export interface LoadTodos {
type: "LOAD_TODOS_ACTION"
}
export interface AddTodo {
type: "ADD_TODO_ACTION",
todo: Todo
}
export type KnownAction = LoadTodos | LoadTodosSuccess | AddTodo;
function isSomeType<T extends KnownAction>(x: any): x is T {
return x && typeof (x.type) === "LOAD_TODOS_ACTION";
}
let knownAction: actions.KnownAction = { type: "LOAD_TODOS_ACTION" };
if (isSomeType(knownAction)) {
let loadTodosAction = knownAction; // load Todos type
}
上記の動作を期待しています。私は一般的な方法でこれをやりたいので、ifSomeType関数でelse文を繰り返す必要はありません。基本的には、文字列リテラル型を 'type'プロパティに基づいた適切な型に変換したいと考えています。私の試みは、これを行うことでした。文字列リテラルタイプのサブタイプと一致するtypescriptパターン
function isSomeType<T extends Action>(x: any): x is T {
type p1 = T['type'];
return x && typeof (x.type) === p1;
}
しかし、メッセージは言う:「p1が」唯一のタイプを指しますが、ここで変数として使用されています。
これを行う方法はありますか?
型の別名は、実行時に利用できないので、このようにそれを行うことはできません。 – MistyK