type AssertFuncSync = (...args: any[]) => boolean
type AssertFunc = (...args: any[]) => Promise<boolean>
我在上面的打字稿中定义了两种类型。
现在,在函数demoFunc
中,我需要检查参数是AssertFuncSync
还是AssertFunc
。我该如何实现?
const demoFunc = (test_func: AssertFunc | AssertFuncSync): any => {
if (test_func is an AssertFunc) {
console.log("it belongs to AssertFunc")
}else{
console.log("it belongs to AssertFuncSync")
}
}
答案 0 :(得分:0)
为此,我相信您可以使用打字稿的打字稿保护功能。docs here
interface Bird {
fly();
layEggs();
}
interface Fish {
swim();
layEggs();
}
function isFish(pet: Fish | Bird): pet is Fish {
return (<Fish>pet).swim !== undefined;
}
答案 1 :(得分:0)
您可以在类型中使用判别式属性。这意味着您在两种类型中都必须具有相同的键,然后仅询问该键。 Typescript可以缩小预编译时间的类型(而不是在c的运行时)
type AssertFuncSync = {
isSync: true,
syncFunc: (...args: any[]) => boolean,
};
type AssertFunc = {
isSync: false,
asyncFunc: (...args: any[]) => Promise<boolean>,
};
const demoFunc = (testFunc: AssertFunc | AssertFuncSync): any => {
switch (testFunc.isSync) {
case true:
testFunc.syncFunc(); // no error
testFunc.asyncFunc(); // error: Property 'asyncFund' does not exist on type
'AssertFuncSync'.
break;
case false :
testFunc.syncFunc(); // error: Property 'syncFunc' does not exist on type
'AssertFunc'
testFunc.asyncFunc(); // no error
}
};
正如您提到的,这太冗长了。您可以使用if语句代替switch case ...
const demoFunc = (testFunc: AssertFunc | AssertFuncSync): any => {
if (testFunc.isSync) {
testFunc.syncFunc(); // no error
} else {
testFunc.asyncFunc(); // no error
}
};