Sequelize / Typescript / Graphql конфликтует по идентификатору как Int против String - PullRequest
0 голосов
/ 25 марта 2020

Я создал сервер Apollo, который поддерживается Sequelize.

Я также пишу свое приложение на TypeScript.

Это создало раздел sh между понятием Sequelize первичного ключа (Int) и понятием GraphQL идентификатора (специальной строки).

В частности, у меня есть тип GQL, который выглядит следующим образом:

type Book {
    id: ID!
    Title: String!
  }

и интерфейс Typescript, который выглядит примерно так:

export interface Book extends Model {
  id: number;
  name: string;
}

В моем преобразователе, У меня есть следующее:

book: async (parent, args, context) => {
      const { models } = context;
      const { id } = args;
      const carrier = await models.Book.findByPk(id);
      return carrier;
    },

Это возвращает ошибку:

Types of property 'id' are incompatible.
                Type 'number' is not assignable to type 'string'.

Что подводит меня к моему вопросу

Есть ли способ заставить ID разрешить в int вместо строки? Я хотел бы избежать переназначения всех полей в Book просто для приведения идентификатора в строку

1 Ответ

0 голосов
/ 25 марта 2020

Нет способа изменить поведение скаляра - он разбирается как строка, потому что это то, что указывает spe c. Вы можете просто преобразовать строку в скаляр следующим образом:

await models.Book.findByPk(parseInt(id, 10));

Однако вы могли бы также просто использовать скаляр Int вместо ID. Самым большим недостатком этого подхода является то, что вы не сможете переключиться на другой тип идентификатора (например, UUID) без внесения в вашу схему серьезных изменений. Использование Int вместо идентификатора не повлияет на кэширование, выполняемое клиентом Apollo - до тех пор, пока поле имеет имя id или _id, оно будет использоваться в ключе кэша независимо от его типа. .

...