TypeScript принимает не числовое / строковое значение, хотя ожидаемый тип параметра - число - PullRequest
1 голос
/ 28 февраля 2020

У меня странная проблема с TypeScript, которую я не понимаю. Это может быть связано с моим отсутствием знаний, так как я никогда не сталкивался с такой проблемой в Java, и это мои первые (исправление ошибок) шаги в TypeScript / Nest JS.

Кажется, безопасность типов не гарантируется в TypeScript, и я хотел бы знать, работает ли он как «разработанный» или есть причина для этого. Вот минимальный пример для воспроизведения проблемы:

  async findAll(@Query() query, @Res() res: Response) {
      ... lines omitted ...
      this.cache.getProxyCache(query.page, query.page_size);
      ... lines omitted ...
  }

query - это объект, который я получил от декоратора @Query в контроллере Nest JS.

  async getProxyCache(page: number = 0, pageSize: number): Promise<AxwayProxy[]> {
    console.log(`page: ${page} typeof: ${typeof page}`);
    console.log(`pageSize: ${pageSize} typeof: ${typeof pageSize}`);

    let pageSizeAdded = pageSize + 3;
    console.log(`pageSizeAdded: ${pageSizeAdded} typeof: ${typeof pageSizeAdded}`);

    let pageSizeAdded2 = Number(pageSize) + 3;
    console.log(`pageSizeAdded2: ${pageSizeAdded2} typeof: ${typeof pageSizeAdded2}`);
    ... lines omitted ...

вывод (обратите внимание на pageSizeAdded, который является ошибкой, pageSizeAdded2 рассчитан правильно, потому что я преобразовал из string в number):

page: 1 typeof: string
pageSize: 4 typeof: string
pageSizeAdded: 43 typeof: string
pageSizeAdded2: 7 typeof: number

Мне интересно, что page и pageSize - тип string, хотя параметр функции объявлен с типом number.

Кажется, что TypeScript показывает сообщение об ошибке, когда я пытаюсь вызвать функцию напрямую со строковыми значениями (например, this.cache.getProxyCache('1', '2');), но принимаю не числовое значение, когда оно передается из другого объекта.

Кто-нибудь сталкивался с такой же проблемой? Это баг, известное ограничение? Почему это разрешено?

Спасибо, Кристоф

1 Ответ

2 голосов
/ 28 февраля 2020

Вы должны понимать, что TypeScript будет преобразован в JavaScript перед выполнением. Таким образом, весь набор текста исчезнет. Когда вы объявляете функцию типа

async getProxyCache(page: number = 0, pageSize: number): Promise<AxwayProxy[]>

, вы запрашиваете TypeScript , чтобы проверить, что параметры и тип возвращаемого значения имеют соответствующий тип. Но эта проверка выполняется только во время переноса (и dev, с хорошей IDE). Во время выполнения типы исчезают, и вы можете предоставить все, что захотите, не будет ни элемента управления, ни приведения. Останется только часть JavaScript:

async getProxyCache(page = 0, pageSize)

Если вам интересно, почему TypeScript принял, что вы вызываете свою функцию с чем-либо, что не является number , затем проверьте тип page, где вызывается функция. Если он имеет тип any, то он объявляется совместимым с чем-либо. В таком случае, вероятно, лучше объявить его как unknown, что потребует проверки соответствия типа перед использованием.

...