Express TypeScript: почему мой метод контроллера выдает сообщение об ошибке?

#javascript #node.js #typescript

#javascript #node.js #typescript

Вопрос:

люди. Я только начинаю работать с TypeScript, и, таким образом, часть того, чтобы мои ноги промокли, включает преобразование бэкэнда Express, который я создал, в TS. До этого момента все было хорошо, но теперь у меня возникли некоторые довольно необычные проблемы. В частности, строки const hasVoted = poll.votedBy.some((voter): boolean => voter.equals(voterId)); и const choice = await poll.choices.id(choiceId); в приведенном ниже фрагменте кода, которые приводят к Property 'equals' does not exist on type 'string' и Property 'choices' does not exist on type 'Poll amp; Document' сообщениям об ошибках соответственно. Для справки, у меня версия JS работает просто отлично, так чего же мне здесь может не хватать?

Post Controller

 import * as mongoose from 'mongoose';
import { Request, Response } from 'express';

import { Poll } from '../models/index';

class PollsController {
  public async addNewPoll(req: Request, res: Response) {
    // ...
  }

  public async voteInPoll(req: Request, res: Response) {
    const { category, pollId } = req.params;
    const { name, choiceId, voterId } = req.body;

    try {
      const poll = await Poll.findById(pollId);

      // Check if user has already voted in poll
      const hasVoted = poll.votedBy.some((voter): boolean => voter.equals(voterId));

      if (!voterId) {
        res
          .status(401)
          .json({ message: 'Sorry, you must be logged in to vote' });
      } else if (voterId amp;amp; hasVoted) {
        res
          .status(401)
          .json({ message: 'Sorry, you have already participated in poll' });
      } else {
        const choice = await poll.choices.id(choiceId);
        const votedChoice = { name, votes: choice.votes   1 };

        await choice.set(votedChoice);
        await poll.votedBy.push(voterId);

        poll.save();

        res
          .status(200)
          .json({
            message: 'Thank you for voting.',
            poll,
          });
      }
    } catch (error) {
      res.status(404).json({ error });
    }
  }

  // ...
}

export default PollsController
  

Интерфейс опроса

 interface Poll {
  title: string;
  category: string;
  addedBy: string;
  votedBy?: [string];
}

export default Poll;
  

Схема опроса

 import * as mongoose from 'mongoose';

import PollInterface from './poll.interface';

const Schema = mongoose.Schema;

const ChoiceSchema = new Schema({
  name: { type: String },
  votes: { type: Number }
});

const PollSchema = new Schema({
  title: { type: String },
  category: { type: String },
  choices: [ChoiceSchema],
  addedBy: { type: Schema.Types.ObjectId, ref: 'User' },
  votedBy: [{ type: Schema.Types.ObjectId, ref: 'User' }]
},{
    timestamps: true,
});

const Poll = mongoose.model<PollInterface amp; mongoose.Document>('Poll', PollSchema);

export default Poll;
  

Редактировать: включены как интерфейс опроса, так и фрагменты кода схемы

Ответ №1:

Для первой ошибки ваш интерфейс определяется votedBy как массив строк. Вы можете вызвать .some массив, но тогда вы вызываете .equals строку, которая не является методом по типу string . Вы можете изменить

 const hasVoted = poll.votedBy.some((voter): boolean => voter.equals(voterId));
  

Для

 const hasVoted = poll.votedBy.some((voter): boolean => voter === voterId);
  

И второй, который вы не определяете choices в своем Poll интерфейсе. Итак, следующая строка завершается ошибкой компилятора typescript из-за этого.

 const choice = await poll.choices.id(choiceId);
  

Вам нужно добавить choices свойство as в свой Poll интерфейс. Я не знаю точно, какова ваша реализация, но вы хотели бы добавить что-то вроде следующего в свой Poll интерфейс.

 choices: {
  id:() => string;
}
  

Из вашего кода похоже, что вы пытаетесь найти соответствие choice из заданного choiceId .

Ответ №2:

Свойство ‘equals’ не существует для типа ‘string’: если оно работает в JS, это означает, что избиратель не является ‘string’, как вы объявили.

Проверьте сигнатуру вашего метода Poll.findById(pollId) .