Добавить объект в массив в машинописном тексте

Я просто в замешательстве. Я пытаюсь добавить новые объекты в массив в машинописном тексте, но получил ошибку. в моем интерфейсе есть функция. есть ли у кого-нибудь идеи?

interface Videos{
    title: string;
    description: string;
    like: number;
    pressLike():void;
    pressDislike():void;
}
    
class Video implements Videos{
    public title: string;
    public description: string;
    public like: number;

    constructor(title: string, description: string, like?: number){
        this.title = title;
        this.description = description;
        this.like = like || 0;
    }

    public pressLike():void{
        let ins_like = this.like;
        if (ins_like < 0){
            this.like = 0;
        }else{
            this.like++;
        }
    }

    public pressDislike():void{
        let ins_like = this.like;
        if (ins_like < 0){
            this.like = 0;
        }else{
            this.like--;
        }
    }
}

var videoArr: Videos[] = [
    {"title": "Book 1 Water", "description": "Learn the water bending", "like": 0}
];
    
    // this is where I got the error when I try to add new videos in the array

ошибка говорит об отсутствии свойств pressLike и pressDisplike, но они являются функциями. Я понятия не имею, как добавить их в массив?

Этот объектный литерал не является экземпляром вашего класса. Почему вы пишете это вместо, скажем, var videoArr: Videos[] = [ new Video("Book 1 Water", "Learn the water bending")];? Если вы используете литералы объектов, вам нужно добавить туда методы самостоятельно. Это полностью отвечает на ваш вопрос или я что-то упускаю?

jcalz 05.06.2024 14:52

Почему бы вам просто не использовать new Video(...)?

Rogue 05.06.2024 14:52

Произошла ошибка, поскольку в вашем интерфейсе есть 2 требуемые функции, поэтому вы должны установить их в значении объекта или сделать их необязательными, используя ? или ставь new Video(...), как сказали их ребята

Arsène Jerry ANDRIANARIMANANA 05.06.2024 15:05
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете добавить несколько статических методов для анализа JSON или создания нового экземпляра объекта:

interface Video {
  title: string;
  description: string;
  likeCount: number;
}

class YouTubeVideo implements Video {
  public title: string;
  public description: string;
  public likeCount: number;

  constructor(title: string, description: string, likeCount?: number) {
    this.title = title;
    this.description = description;
    this.likeCount = likeCount ?? 0;
  }

  public pressLike(): void { /** ... */ }

  public pressDislike(): void { /** ... */ }

  static parse(data: string): YouTubeVideo {
    const parsed: Record<string, object> = JSON.parse(data);
    const title: string = parsed.title as unknown as string;
    const description: string = parsed.description as unknown as string;
    const likeCount: number = parsed.likeCount as unknown as number;
    return new YouTubeVideo(title, description, likeCount);
  }

  static fromObject(data: Video): YouTubeVideo {
    return new YouTubeVideo(data.title, data.description, data.likeCount);
  }
}
const videoArr: Video[] = [
  // Constructor
  new YouTubeVideo("Book 1: Water", "Learn water bending"),

  // From an object
  YouTubeVideo.fromObject({
    title: "Book 2: Earth",
    description: "Learn earth bending",
    likeCount: 0,
  }),

  // Parsed from JSON data
  YouTubeVideo.parse(`{
    "title": "Book 3: Fire",
    "description": "Learn fire bending",
    "likeCount": 0
  }`),
];

console.info(videoArr);

Вы должны указать тип объекта, который хотите поместить в массив.

Вот пример:

interface User {
  id: number;
  name: string;
  email: string;
}

const users: User[] = [];

const newUser: User = {
  id: 1,
  name: 'James',
  email: '[email protected]'
};

users.push(newUser);

Вплоть до простого использования того, что уже есть (ваш конструктор):

var videoArr: Videos[] = [
    new Video("Book 1 Water", "Learn the water bending", 0),
    new Video("Book 2 Earth", "Sokka in the jungle", 4)
];

Если у вас есть хотя бы один класс супертипа (в данном случае Video), можно также вывести тип : Videos[] вашего массива (оставив только var videoArr = [ ... ]). Многие современные IDE (Webstorm/Jetbrains, VSCode и т. д.) также «предварительно просматривают» имена параметров рядом с параметрами вашего конструктора. И наконец, небрежно взгляните на var и let.

Другие вопросы по теме