如何检查打字稿中函数的类型?

时间:2019-03-08 06:45:37

标签: typescript

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")
    }
}

2 个答案:

答案 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
  }
};

check this out

正如您提到的,这太冗长了。您可以使用if语句代替switch case ...

const demoFunc = (testFunc: AssertFunc | AssertFuncSync): any => {
  if (testFunc.isSync) {
    testFunc.syncFunc(); // no error
  } else {
    testFunc.asyncFunc();  // no error
  }
};