Как исправить «Невозможно использовать« новый »с выражением, тип которого не содержит вызов или создать подпись» в угловом 4? - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь следовать учебному пособию, и я застрял в ошибке компилятора, потому что он ожидает стандартный класс с конструктором, но в учебном пособии именно так это и было сделано. Может быть, что-то изменилось с момента выпуска учебника, но я не могу понять человека, который создал учебник. Я хотел бы закончить это.

Сообщение об ошибке, которое я получаю:

"Невозможно использовать 'new' с выражением, тип которого не содержит вызов или подпись конструкции."

Я новичок в угловой, пожалуйста, помогите мне.

книжный магазин-передние / SRC / приложение / книга детализация / книга-detail.component.ts

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Book } from '../service/model/Book';
import 'rxjs/Rx';
import { BookService } from '../service/api/book.service';

@Component({
  selector: 'bs-book-detail',
  templateUrl: './book-detail.component.html',
  styles: []
})
export class BookDetailComponent implements OnInit {

  private book: Book = new Book();

  constructor(private router: Router, private route: ActivatedRoute, private bookService: BookService) { }

  ngOnInit() {
    this.route.params
      .map(params => params['bookId'])
      .switchMap(id => this.bookService.getBook(id))
      .subscribe(book => this.book = book);
  }

  delete() {
    this.bookService.deleteBook(this.book.id)
      .finally(() => this.router.navigate(['/book-list']))
      .subscribe();
  }
}

книжный авансовые / SRC / приложение / сервис / модель / Book

 /**
 * BookStore APIs
 * BookStore APIs exposed from a Java EE back-end to an Angular front-end
 *
 * OpenAPI spec version: 1.0.0
 * NOTE: This class is auto generated by the swagger code generator program.
 * https://github.com/swagger-api/swagger-codegen.git
 * Do not edit the class manually.
 */


/**
 * Book resourse representation.
 */
export interface Book {
    /**
     * Identifier
     */
    id?: number;
    /**
     * Title of the book
     */
    title: string;
    /**
     * Summary describing the book
     */
    description?: string;
    /**
     * Unit cost
     */
    unitCost?: number;
    /**
     * ISBN number
     */
    isbn: string;
    /**
     * Date in which the book has been published
     */
    publicationDate?: Date;
    /**
     * Number of pages
     */
    nbOfPages?: number;
    /**
     * URL of the image cover
     */
    imageURL?: string;
    /**
     * Language in which the book has been written
     */
    language?: Book.LanguageEnum;
}
export namespace Book {
    export type LanguageEnum = 'ENGLISH' | 'FRENCH' | 'SPANISH' | 'PORTUGUESE' | 'ITALIAN' | 'FINISH' | 'GERMAN' | 'DEUTSCH' | 'RUSSIAN';
    export const LanguageEnum = {
        ENGLISH: 'ENGLISH' as LanguageEnum,
        FRENCH: 'FRENCH' as LanguageEnum,
        SPANISH: 'SPANISH' as LanguageEnum,
        PORTUGUESE: 'PORTUGUESE' as LanguageEnum,
        ITALIAN: 'ITALIAN' as LanguageEnum,
        FINISH: 'FINISH' as LanguageEnum,
        GERMAN: 'GERMAN' as LanguageEnum,
        DEUTSCH: 'DEUTSCH' as LanguageEnum,
        RUSSIAN: 'RUSSIAN' as LanguageEnum
    }
}

Если я попытаюсь измениться личная книга: книга = новая книга ();

до

Частная книга: Книга;

Я получаю эту ошибку

BookFormComponent.html:6 ERROR TypeError: Cannot read property 'title' of undefined
    at Object.eval (BookFormComponent.html:6)
    at Object.debugUpdateDirectives [as updateDirectives] (core.js:14697)
    at checkAndUpdateView (core.js:13844)
    at callViewAction (core.js:14195)
    at execComponentViewsAction (core.js:14127)
    at checkAndUpdateView (core.js:13850)
    at callViewAction (core.js:14195)
    at execEmbeddedViewsAction (core.js:14153)
    at checkAndUpdateView (core.js:13845)
    at callViewAction (core.js:14195)

1 Ответ

0 голосов
/ 08 мая 2018

- если вам нужно / вы хотите создать экземпляр, возможно, пользовательского объекта, в то же время получая преимущества таких вещей, как проверка типов, таких как аргументы, возвращаемые типы или обобщения, - класс имеет смысл. Если вы не создаете экземпляры - у нас есть интерфейсы, и их преимущество заключается в том, что вы не генерируете никакого исходного кода, но позволяете нам несколько «виртуально» проверять тип в нашем учебнике code.yes, использующем стандарты javaEE в угловых, но это немного по-другому вы можете написать свой интерфейс следующим образом:

interface Book {
    id?: number;
    title: string;
    description?: string;
    unitCost?: number;
    isbn: string;
    publicationDate?: Date;
    nbOfPages?: number;
    imageURL?: string;
    language?: Book.LanguageEnum;
}
type LanguageEnum = 'ENGLISH' | 'FRENCH' | 'SPANISH' | 'PORTUGUESE' | 'ITALIAN' | 'FINISH' | 'GERMAN' | 'DEUTSCH' | 'RUSSIAN';
const LanguageEnum = {
        ENGLISH: 'ENGLISH' as LanguageEnum,
        FRENCH: 'FRENCH' as LanguageEnum,
        SPANISH: 'SPANISH' as LanguageEnum,
        PORTUGUESE: 'PORTUGUESE' as LanguageEnum,
        ITALIAN: 'ITALIAN' as LanguageEnum,
        FINISH: 'FINISH' as LanguageEnum,
        GERMAN: 'GERMAN' as LanguageEnum,
        DEUTSCH: 'DEUTSCH' as LanguageEnum,
        RUSSIAN: 'RUSSIAN' as LanguageEnum
    }
export{
    Book,
    LanguageEnum,
    LanguageEnum
}

импортируйте все, что вам нужно, и используйте их для использования интерфейса:

import { Book } from '../service/model/Book'; 

private book: Book = {title: 'title' , isbn: 'isbn' , ... }

и преобразовывать его в класс не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...