Аргумент типа «Число» нельзя назначить параметру типа «строка | номер | ноль | неопределенный'. [плагин angular-компилятора]

Я получил ошибку с DecimalPipe при преобразовании числа

Мой код: Услуга

export interface RoomList {
    roomNumber: number;
    roomType: string;
    amenities: string;
    price: number;
    photos: string;
    checkinTime: Date;
    checkoutTime: Date;
    rating: Number;
}

Компонент

import { Component } from '@angular/core';
import { Room, RoomList } from './rooms';
import { CurrencyPipe, DatePipe, DecimalPipe, LowerCasePipe, NgClass, NgFor, NgIf, NgStyle } from '@angular/common';

@Component({
  selector: 'app-rooms',
  standalone: true,
  imports: [NgIf, NgFor, NgClass, NgStyle, DatePipe, CurrencyPipe, LowerCasePipe, DecimalPipe],
  templateUrl: './rooms.component.html',
  styleUrl: './rooms.component.scss'
})
export class RoomsComponent {
  hotelName = "Hilton Hotel";
  numberOfRoom = 10;
  hideRoom = false;
  rooms: Room = {
    availableRooms: 10,
    bookedRooms: 5,
    totalRooms: 20
  };

  roomList: RoomList[] = [
    {
      roomNumber: 1,
      roomType: 'Heloe',
      amenities: "HN",
      price: 5000,
      photos: './image2',
      checkinTime: new Date('11-Nov-2021'),
      checkoutTime: new Date('12-Nov-2021'),
      rating: 4.555
    },
    {
      roomNumber: 2,
      roomType: 'Donh',
      amenities: "NB",
      price: 10000,
      photos: './image2',
      checkinTime: new Date('17-Sep-2021'),
      checkoutTime: new Date('20-Sep-2021'),
      rating: 3.516
    },
    {
      roomNumber: 3,
      roomType: 'Holds',
      amenities: "DN",
      price: 200,
      photos: './image3',
      checkinTime: new Date('17-Sep-2021'),
      checkoutTime: new Date('20-Sep-2021'),
      rating: 3.99999
    },
    {
      roomNumber: 4,
      roomType: 'Bed',
      amenities: "CT",
      price: 1000,
      photos: './image4',
      checkinTime: new Date('11-Mar-2024'),
      checkoutTime: new Date('20-July-2024'),
      rating: 4.999
    }
  ];


  fnName() {

  }
  toggle() {
    this.hideRoom = !this.hideRoom;
  }
}

HTML

<div *ngIf = "rooms.availableRooms > 0">
    Rooms List
    <!-- {{roomList}} -->
    <table>
        <tr>
            <th>Order</th>
            <th>Room Number</th>
            <th>Room Type</th>
            <th>Room Amenity</th>
            <th>Room Price</th>
            <th>Checkin Time</th>
            <th>Checkout Time</th>
            <th>Rating</th>
        </tr>
        <tr *ngFor = "let room of roomList; let i=index;" [ngClass] = "i%2 ? 'even' : 'odd'">
            <td>{{i}}</td>
            <td>{{room.roomNumber}}</td>
            <td>{{room.roomType}}</td>
            <td>{{room.amenities | lowercase}}</td>
            <td>{{room.price | currency : 'INR'}}</td>
            <td>{{room.checkinTime | date:'short'}}</td>
            <td>{{room.checkoutTime | date: 'short'}}</td>
            <td>{{room.rating | number}}</td>
        </tr>
    </table>
</div>

Я попробовал использовать этот формат ниже

<td>{{room.rating | number: '1.1-2'}}</td>

но возникла ошибка типа

X [ERROR] NG9: No overload matches this call.
  Overload 1 of 3, '(value: string | number, digitsInfo?: string | undefined, locale?: string | undefined): string | null', gave the following error.
    Argument of type 'Number' is not assignable to parameter of type 'string | number'.
  Overload 2 of 3, '(value: null | undefined, digitsInfo?: string | undefined, locale?: string | undefined): null', gave the following error.
    Argument of type 'Number' is not assignable to parameter of type 'null | undefined'.
  Overload 3 of 3, '(value: string | number | null | undefined, digitsInfo?: string | undefined, locale?: string | undefined): string | null', gave the following error.
    Argument of type 'Number' is not assignable to parameter of type 'string | number | null | undefined'. [plugin angular-compiler]

    src/app/rooms/rooms.component.html:30:23:
      30 │             <td>{{room.rating | number: '1.1-2'}}</td>
         ╵                        ~~~~~~

  Error occurs in the template of component RoomsComponent.

    src/app/rooms/rooms.component.ts:9:15:
      9 │   templateUrl: './rooms.component.html',
        ╵                ~~~~~~~~~~~~~~~~~~~~~~~~
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Number (начинается с заглавной буквы) — специальный встроенный тип. Это необходимо только в очень редких случаях. В вашем случае вам нужно использовать строчную букву number. См. документацию TypeScript .

Ошибка, с которой вы столкнулись, связана с тем, что DecimalPipe (или числовой канал) ожидает значение типа string, number, null или undefined, но ваш интерфейс RoomList использует тип Number для поля рейтинга вместо числа.

Тип «Число» в TS — это объект-оболочка, а не примитивный тип числа. DecimalPipe не может обрабатывать этот тип оболочки, отсюда и ошибка.

Чтобы это исправить, вы можете изменить тип рейтинга в интерфейсе RoomList с номера на номер. Попробуйте следующее:

export interface RoomList {
roomNumber: number;
roomType: string;
amenities: string;
price: number;
photos: string;
checkinTime: Date;
checkoutTime: Date;
rating: number; // Change this line
}

Большое спасибо @Kevin. Я понял

ToanTV13 27.07.2024 04:02

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