Typescript 使用 keyof 时,索引签名参数类型必须为 'string' 或 'number'

标签 typescript

使用 Typescript,我尝试编写一个函数,该函数接受通用对象和验证规则的键值映射以应用于每个属性。当使用 keyof 属性来验证“validators”对象中传递的 key 是否在 TObject 泛型中时,我得到 An indexsignatureparametertypemustbe'string'or'number'。后来,当尝试访问验证器中的值时,我得到No indexsignature with a type 'string' was found on type '{}'

function isValid<TObject>(
  o: TObject,
  validators: {
    [key: keyof TObject]: (o: TObject) => boolean;
  }
) {
  for (const validator in validators) {
    if (!validators[validator](o)) {
      return false;
    }
  }

  return true;
}

type Todo = {
  text: string;
  details: string;
  completed: boolean;
};

console.log(
  isValid<Todo>(
    {
      text: "mow yard",
      details: "needs to be completed asap",
      completed: false
    },
    {
      text: (o: Todo) => o.text.length > 0,
      completed: (o: Todo) => !!o.completed
    }
  )
);

最佳答案

您应该使用关键字 in 而不是 :,因为 : 用于索引类型(字符串、数字、符号)

function isValid<TObject>(
  o: TObject,
  validators: {
    [key in keyof TObject]: (o: TObject) => boolean;
  }
) {
  for (const validator in validators) {
    if (!validators[validator](o)) {
      return false;
    }
  }

  return true;
}

如果 key 是可选的,请使用?:

  validators: {
    [key in keyof TObject]?: (o: TObject) => boolean;
  }

关于Typescript 使用 keyof 时,索引签名参数类型必须为 'string' 或 'number',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66838689/

相关文章:

javascript - 从 2.7.x 升级到 2.8.x 后出现 TypeScript 错误 TS2349

typescript - 选中/未选中时如何选中/取消选中ion-select中的所有选项选择ionic3中的所有选项

angular - 在 Angular Typescript 库中使用 MomentJS 时出错

typescript - 我如何编写一个将可变或不可变数组作为参数的通用 TypeScript 函数

angular - 如何在 Angular 7 的路由保护子句中访问路由参数?

typescript - VueJS + TypeScript 装饰器问题

javascript - 可以预加载使用 canLoad 的模块吗?

javascript - 使用Socket.IO传输的文件对象变成 'ArrayBuffer'?

javascript - npx ts-lint 在 docker 中运行时找不到模块 'typescript'

javascript - 双线性缩放算法奇怪的效果