Я использую конфигурацию tslint от Microsoft tslint-microsoft-contrib, и мне она очень нравится. Однако есть одно правило, которое предупреждает меня о моем коде. Я не понимаю текста описания правила или того, как я могу решить эту проблему более элегантно.

[tslint] Backbone get () вызывается вне модели-владельца: this.client.get ('location') (no-backbone-get-set-outside-model)

Код:

import * as Redis from 'ioredis';
import config from './config';

export class RedisWrapper {
  private client: Redis.Redis

  constructor(redisUrl: string) {
    this.client = new Redis(redisUrl)
  }

  public async getLocations(): ILocation[] {
    const locationsResponse: string = await this.client.get('locations')
  }
}

В этой строке появляется предупреждение tslint: const locationsResponse: string = await this.client.get('locations')

Вопрос:

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

1
kentor 3 Дек 2017 в 05:12

1 ответ

Лучший ответ

Я процитирую HamletDRC (из команды Microsoft), который очень хорошо объяснил само правило:

Смысл правила no-backbone-get-set-external-model состоит в том, чтобы убедиться, что вы не вызываете динамически отправляемые методы, для которых компилятор не может обеспечить корректность. Например, компилятор не будет жаловаться, если вы наберете route.params.get ('id'), route.params.get ('ID'), route.params.get ('Id'), но только один из этих вызовов будет фактически работают во время выполнения. Совет по дизайну - определить статически типизированный метод getId (): number для объекта RouteParams, чтобы компилятор мог принудительно применять эти вызовы. Итак, на мой взгляд, правило действительно нашло проблему в вашем коде, которую вы должны исправить (но см. Мой второй пункт :))

Источник: https://github.com/Microsoft/tslint-microsoft-contrib/ вопросов / 123

В этом конкретном случае класс Redis можно расширить следующим образом:

export class RedisWrapper extends Redis {
  public async getLocations(): Promise<ILocation[]> {
    const response: string = await this.get('locations');
    if (response == null || response.length === 0) { return []; }

    return <ILocation[]>JSON.parse(response);
  }
}
2
kentor 3 Дек 2017 в 05:55