1. ホーム
  2. javascript

TypeScriptの条件付き型

2023-09-05 08:04:44

質問

TypeScriptで条件付き型は可能でしょうか?

現在、私は以下のようなインターフェースを持っています。

interface ValidationResult {
  isValid: boolean;
  errorText?: string;
}

しかし、私は errorText を削除し isValidfalse として 必須 プロパティを指定します。

以下のようなインターフェイスで書ければいいのですが。

interface ValidationResult {
  isValid: true;
}

interface ValidationResult {
  isValid: false;
  errorText: string;
}

しかし、ご存知のように、それは不可能です。では、この状況について、あなたはどのようにお考えですか?

どのように解決するのですか?

この種のロジックをモデル化する1つの方法は、次のようなユニオン型を使用することです。

interface Valid {
  isValid: true
}

interface Invalid {
  isValid: false
  errorText: string
}

type ValidationResult = Valid | Invalid

const validate = (n: number): ValidationResult => {
  return n === 4 ? { isValid: true } : { isValid: false, errorText: "num is not 4" }
}

コンパイラは、ブーリアンフラグに基づいて型を絞り込むことができます。

const getErrorTextIfPresent = (r: ValidationResult): string | null => {
  return r.isValid ? null : r.errorText
}