检查函数参数的类型

Bri*_*ong 5 javascript async-await typescript es6-promise ecmascript-2017

由于 TypeScript 是 Javascript 的超集,并且“Type”会在生成的 js 文件中被删除,所以我想使用“type”不会像这样工作,对吧?另外,除了两种不同的方法之外,还有什么更好的方法吗?

type VoidToVoidFunc = () => void;
type VoidToPromiseVoidFunc = () => Promise<void>;

async function add(func: VoidToVoidFunc  | VoidToPromiseVoidFunc) {
    if (typeof func == typeof VoidToVoidFunc)
        func(); 
    else
        await func();
}

add(() => console.log(1));
Run Code Online (Sandbox Code Playgroud)

Twi*_*her 3

正如您在这里所看到的,当后面跟随一个不可thenable的值时await,就会构造并使用一个已经实现的值Promise

所以最简单的实现就是await函数调用的结果。事实上,如果awaitPromise还不是 a ,则将其包装在 a 中Promise

type VoidToVoidFunc = () => void;
type VoidToPromiseVoidFunc = () => Promise<void>;

async function add(func: VoidToVoidFunc  | VoidToPromiseVoidFunc) {
  await func();
  // Do something else
}

add(() => console.log(1));
Run Code Online (Sandbox Code Playgroud)

此行为由 TypeScript 正确键入,实际上,当您编写const test = await func();并悬停变量时,其类型会被正确推断为void.

TypeScript 游乐场