[英]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.