Типы для объектного литерала и функции

#javascript #typescript

#javascript #typescript

Вопрос:

Я создаю функцию, в которой она принимает type и field в качестве своих аргументов.

В основном функции первый аргумент является ключом объекта errorTypes, а второй аргумент — errorArgTypes .

Я получаю сообщение об ошибке // Все параметры типа не используются; для приведенного ниже кода.

пожалуйста, сообщите.

 type errorArgTypes = {
  field: string;
};

const errorTypes = {
  INTERNAL_SERVER_ERROR: {
    code: 500,
    message: "Internal Server Error 😵",
  },
  AUTH_NOT_FOUND: {
    code: 401,
    message: "User Not Found ❗️",
  },
  AUTH_ALREADY_EXIST: {
    code: 404,
    message: "User Already Existed 👀",
  },
  AUTH_NOT_MATCH: {
    code: 402,
    message: "Email or Password Not Match 🥑",
  },
  AUTH_NO_PERMISSION: {
    code: 403,
    message: "No Permission 🔫",
  },
  DATA_NOT_FOUND: {
    code: 401,
    message: "No Data 😕",
  },
};

type typeOfError = key in  errorTypes;

const foo = {
  "hello": "hola"
};

let data: { [key in keyof typeof foo]:number} amp; { name: string, index: number }[] = [] as any;



function prop<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}

// All type parameters are unused;

const BaseError = <Key extends keyof typeOfError, errorArgTypes>(type, arg?) => {
  const { code, message } = errorTypes[type];
  return new ApolloError(message, code, arg);
};
 

Комментарии:

1. Пожалуйста, используйте keyof typeof errorTypes вместо key in errorTypes . Какой тип вы ожидаете здесь: type, arg? ?

2. Я не могу воспроизвести описанную вами ошибку . Игровая площадка TS показывает ошибку в BaseError because of noImplicitAny , но не говорит, что параметры не используются. Отключение правила оставляет две другие ошибки — key in errorTypes недопустимый синтаксис и ApolloError не определено.

Ответ №1:

Попробуйте этот подход:

 const errorTypes = {
  INTERNAL_SERVER_ERROR: {
    code: 500,
    message: "Internal Server Error 😵",
  },
  AUTH_NOT_FOUND: {
    code: 401,
    message: "User Not Found ❗️",
  },
  AUTH_ALREADY_EXIST: {
    code: 404,
    message: "User Already Existed 👀",
  },
  AUTH_NOT_MATCH: {
    code: 402,
    message: "Email or Password Not Match 🥑",
  },
  AUTH_NO_PERMISSION: {
    code: 403,
    message: "No Permission 🔫",
  },
  DATA_NOT_FOUND: {
    code: 401,
    message: "No Data 😕",
  },
};

type errorArgTypes = {
  field: string;
};

const BaseError = <
  Key extends keyof typeof errorTypes,
  errorArgTypes
>(type: Key, arg?: errorArgTypes) => {
  const { code, message } = errorTypes[type];

  return new ApolloError(message, code, arg);
};
 

Игровая площадка TypeScript