1

文字列の長さを2 つの方法(固定または範囲)で確認したいとします。

/* Fixed check */
check('abc', {length: 1}); // false
check('abc', {length: 3}); // true

/* Range check */
check('xyz', {minLength: 5, maxLength: 10}); // false
check('xyz', {minLength: 1, maxLength: 10}); // true
check('xyz', {minLength: 3, maxLength: 3}); // true

最初に次のように 2 つのインターフェイスを宣言しました。

interface StringFixed {
  length: number;
}

interface StringRange {
  minLength: number;
  maxLength: number;
}

次に、関数を記述しようとします。

function check(value: string, schema: StringFixed): boolean;
function check(value: string, schema: StringRange): boolean;
function check(value: string, schema: StringFixed | StringRange): boolean {
  if (typeof schema.length !== 'undefined') { // ERROR
    // Fixed check
  } else {
    // Range check
  }
}

しかし、TypeScript は関数の最初の行で ERROR を報告します。

TS2339: Property 'length' does not exist on type 'StringFix | StringRange'

私の質問は TypeScript でこれを行う方法ですか?

4

1 に答える 1

2

あなたはとても近いです。:-) そこにあると予想されるプロパティの値の型を求めています ( typeof schema.length)。タイプ ガードを実装するには、プロパティが存在するかどうかを確認します。

if ("length" in schema) {
    // Fixed check
} else {
    // Range check
}

TypeScript プレイグラウンドの作業コピー

于 2020-05-10T16:27:58.297 に答える