首页 > 解决方案 > 键入一个函数对象,该对象使用字符串键动态调用函数并将参数传递给返回的函数

问题描述

假设出于某种原因,我需要一个将函数作为键的对象,以便我可以使用字符串动态调用函数。例如:

const add_one = (n) => {
  return n + 1;
};

const add_two = (n) => {
  return n + 2;
};

const add_three = (n) => {
  return n + 3;
};

const functionHelper = {
  add_one,
  add_two,
  add_three,
};

var names = ['one', 'two', 'three'];

for (let i = 0; i < 3; i++) {
  let funName = `add_${names[i]}`;
  let result = functionHelper[funName](1);
  console.log(`Adding ${names[i]}: ${result}`);
};

我正在尝试打字functionHelper,但对如何进行感到困惑。这是我到目前为止所拥有的:

const add_one = (n: number) => {
  return n + 1;
};

const add_two = (n: number) => {
  return n + 2;
};

const add_three = (n: number) => {
  return n + 3;
};

interface Helper {
  (): any;
};

const functionHelper: Helper = {
  add_one,
  add_two,
  add_three,
};

var names: string[] = ['one', 'two', 'three'];

for (let i = 0; i < 3; i++) {
  let funName: string = `add_${names[i]}`;
  let result = functionHelper[funName](1);
  console.log(`Adding ${names[i]}: ${result}`);
};

产生的错误:

对象字面量只能指定已知属性,而“Helper”类型中不存在“add_one”

标签: typescript

解决方案


您可以将Helper接口定义为:

interface Helper {
    [key: string]: (n: number) => number;
};

游乐场

funName或者另一种选择是根据您的类型断言类型functionHelper,这样您就不必定义Helper类型并使您的functionHelper密钥任意:

let funName = `add_${names[i]}` as keyof typeof functionHelper;

操场


推荐阅读