繁体   English   中英

Typescript 使用 keyof 时,索引签名参数类型必须是“字符串”或“数字”

[英]Typescript An index signature parameter type must be either 'string' or 'number' when using keyof

使用 Typescript,我正在尝试编写一个 function,它采用通用 object 和验证规则的键值映射以应用于每个属性。 当使用 keyof 属性验证“验证器”object 中传递的密钥是否在TObject泛型中时,我得到An index signature parameter type must be either 'string' or 'number' 后来,当尝试访问validators中的值时,我得到No index signature with a parameter of 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;
}

如果键是可选的,请使用?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM