首页 > 解决方案 > 如何根据 Typescript 文档将可选参数传递给回调?

问题描述

我正在阅读 Typescript 文档的注意事项部分,并且没有关于将可选参数传递给回调函数的注意事项。这是示例:

/* WRONG */
interface Fetcher {
  getObject(done: (data: any, elapsedTime?: number) => void): void;
}

但是我想知道如果我真的需要 elapsedTime 是可选的,如果不是通过使用 ? 装饰师?

标签: typescripttypescript-typings

解决方案


如果我真的需要 elapsedTime 是可选的怎么办,

如果你真的需要它,那就去做(使用?)。但你很可能不需要它。相反,您更有可能误解了它会产生什么影响。使其成为可选意味着将传递给回调的内容是不可预测的。例如:

const doRandomStuff = (callback: (elapsedTime?: number) => void) => {
  const before = Date.now();
  // do some stuff that takes time
  if (Math.random() > 0.5) {
    callback(Date.now() - before);
  } else {
    callback();
  }
}

doRandomStuff((elapsed?: number) => {
  if (typeof elapsed === 'number') {
    console.log('elapsed', elapsed);
  } else {
    console.log('no elapsed time was received');
  }
});

更有可能的是,您所追求的是“您可以根据需要使用经过的时间,或者不使用它”。但是强制参数已经是这种情况了,所以你不需要做任何事情来实现它。例如:

const doPredictableStuff = (callback: (elapsedTime: number) => void) => {
  const before = Date.now();
  // do some stuff that takes time
  callback(Date.now() - before);
};

// This is legal
doPredictableStuff((elapsed) => {
  console.log('elapsed', elapsed);
});

// And so is this
doPredictableStuff(() => {
  console.log('done');
});

推荐阅读