簡體   English   中英

如何將 function 參數定義為兩種類型之一

[英]How to define a function parameter to be either of two types

我該如何編譯。

type Matchmaker = (data: MatcherData, name: string) => string
type MatcherData = RegExp | Array<string>

function makeDataUser(fU: (data: MatcherData) => string): Matchmaker {
    return function (data: MatcherData, name: string): string {
      return fU(data) + name;
    }
}


const user1 = makeDataUser((data: MatcherData): string => {
    if (typeof data === 'regexp') {
        if ("lkajdsf".match(data)) {
            return "yes";
        }
        return "no";
    } else {
        return data.join('');
    }
});

const user2 = makeDataUser((data: MatcherData): string => {
    if (typeof data !== 'regexp') {
        return "yes";
    } else {
        return "no";
    }
}


const mRegexUser = user1(/regex/, 'name');
const mArrayUser = user2(['lkajf'], 'name2');

我希望 function 參數是兩種類型之一,並在任何一種情況下都使用它。

訣竅是我知道user1總是期待RegExp ,而user2總是期待Array<string> 但我想為他們提供上面的通用 function。

如果您在Matchmaker函數中切換檢查data類型的順序,編譯器將能夠縮小類型。 您需要先將其縮小為是數組或不是數組,因為您發現沒有typeof <regexp type>

const user1 = makeDataUser((data: MatcherData): string => {
  if (Array.isArray(data)) {
    return data.join("");
  } else {
    if ("lkajdsf".match(data)) {
      return "yes";
    }
    return "no";
  }
});

const user2 = makeDataUser((data: MatcherData): string => {
  if (Array.isArray(data)) {
    return "no";
  } else {
    return "yes";
  }
});

如果您以后有更復雜的類型,您可以考慮使用可區分的 union ,您可以在其中選擇一個關鍵屬性(下面的type )來告訴編譯器如何區分(區分)聯合的不同分支。

type Matchmaker = (data: MatcherData, name: string) => string;
type MatcherData =
  | {
      type: "RegExp";
      value: RegExp;
    }
  | {
      type: "Other";
      value: Array<string>;
    };

function makeDataUser(fU: (data: MatcherData) => string): Matchmaker {
  return function (data: MatcherData, name: string): string {
    return fU(data) + name;
  };
}

const user1 = makeDataUser((data: MatcherData): string => {
  if (data.type === "RegExp") {
    if ("lkajdsf".match(data.value)) {
      return "yes";
    }
    return "no";
  } else {
    return data.value.join("");
  }
});

const user2 = makeDataUser((data: MatcherData): string => {
  if (data.type === "RegExp") {
    return "yes";
  } else {
    return "no";
  }
});

const mRegexUser = user1({ type: "RegExp", value: /regex/ }, "name");
const mArrayUser = user2({ type: "Other", value: ["lkajf"] }, "name2");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM