簡體   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