#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)
.