Ответы пользователя по тегу TypeScript
  • Как разбить большой файл angular на много файлов, при этом оставаясь в одном классе?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Для чего-то подобного можно юзать миксины, с помощью какуй-нить либы или напрямую.
    Это не совсем то и костыли, но ничего лучше нет.
    Ответ написан
    Комментировать
  • Можно ли форсировать вывод типа для части дженерика?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Нельзя, увы. На github'е много просьб это запилить, но пока(v3.8) надежды не много.
    Если походить там по перекрёстным ссылкам, можно найти разные (некрасивые) workaround для конкретных случаев, но вот прямо как вы хотите - не получится.
    Ответ написан
  • Как типизировать этот объект?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Как есть, так и типизируй.

    Как минимум:
    state.books.filter((book: { id: string }) => book.id !== id)
    А лучше:
    interface Book {
      id: string;
      // ...
    }
    state.books.filter((book: Book) => book.id !== id)
    А ещё лучше:
    interface Book {
      id: string;
      // ...
    }
    interface State {
      books: Book[];
      // ...
    }
    const state: State = ...
    
    state.books.filter(book => book.id !== id)
    Ответ написан
    Комментировать
  • Как перестать загрязнять код импортом интерфейсов?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Можно просто положить где-то(во включённой в tsconfig.json) директории какой-нить global.d.ts и просто накидать туда часто используемых интерфейсов. )
    Но, конечно, если интерфейсы связанны с какими-то модулями, правильно и хранить их в соответствующих модулях. Всё равно же используя модуль, вы оный импортируете, добавка к импорту ещё и интерфейса погоды не делает.
    Ответ написан
    Комментировать
  • Как правильно добавить новое публичное поле в класс на TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Ну или просто проверять что класс пришёл именно тот что надо.)
    class Main {
        constructor(public name: string) {}
    }
    
    class Sub extends Main {
        constructor(name: string, public lastname: string) {
            super(name)
        }
    }
    
    const sub = new Sub('michael', 'jackson')
    
    function hello (person: Main) {
        console.log(person.name)
        if(person instanceof Sub) {
            console.log(person.lastname)
        }
    }
    
    hello(sub)
    Ответ написан
    Комментировать
  • Как сделать чтобы другие параметры были не обязательны?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Мы же говорим о typescript?
    function test (a: number, b?: number, c?: number) {
      console.log(a);
      if (b) console.log(b);
      if (c) console.log(c);
    }
    
    test(1) // консоль: 1
    test(1, 2) // консоль: 1, 2
    Ответ написан
    Комментировать
  • Как исправить ошибку Element implicitly has an 'any'?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    interface Dictionary<T> {
      [key: string]: T
    }
    
    function serialize<T extends Dictionary<string | number[]>> (arg: T) {
      var res = '';
    
      var replaceNamePop: Dictionary<string> = {
        modules: 'module',
        categories: 'category',
        searchFieldsList: 'searchFieldList'
      };
    
      Object.keys(arg).forEach(function (this: T, key) {
        if (Array.isArray(this[key])) {
          for (var j = 0; j < this[key].length; j++) {
            if (typeof replaceNamePop[key] != 'undefined')
              res += '&' + replaceNamePop[key] + '=' + this[key][j];
            else
              res += '&' + key + '=' + this[key][j];
          }
        } else {
          if (typeof replaceNamePop[key] != 'undefined')
            res += '&' + replaceNamePop[key] + '=' + this[key];
          else
            res += '&' + key + '=' + this[key];
        }
      }, arg);
      return res;
    }
    
    serialize({
      'modules': [20],
      'categories': [20],
      'keyword': 'keyword',
      'time': 'time',
      'catRelation': 'cat',
      'sortField': 'sort',
      'sortDirection': 'ASC',
      'searchFieldsList': 'list'
    });
    serialize({
      'modules': [20, 25],
      'categories': [20, 58],
      'keyword': 'keyword',
      'time': 'time',
      'catRelation': 'cat',
      'sortField': 'sort',
      'sortDirection': 'ASC',
      'searchFieldsList': 'list'
    });
    serialize({
      'modules': [20, 25],
      'keyword': 'keyword'
    });
    Ответ написан
    Комментировать
  • Property does not exist on type {}?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    interface User {
      name?: string;
    }
    
    let user: User = {};
    или
    interface User {
      name: string;
    }
    
    let user = {} as User;
    Ответ написан
    Комментировать
  • Как правильно инсталировать mapbox-gl-directions?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    А её нет, этой вашей декларации! *криповый смех*

    Создатели этого модуля не потрудились сделать декларацию, те декларации что в @types поддерживаются сообществом на открытой основе(лежат вот тут), и туда тоже (пока?) никакой самаритянин не добавил ничего.
    Так что вам остаётся только только сделать декларацию самому. Поможет вам в этом (при некоторой удаче) dts-gen.
    Ответ написан
    Комментировать
  • Как заставить правильно компилировать readonly свойство класса?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    А зачем тебе? Какая у тебя есть для того железобетонная причина?
    А так, ты всегда можешь добавить в цепочку сборки собственноручно написанный loader который выполнит любые нужные тебе преобразования.
    Ответ написан
  • React-typescript cannot find module "typescript"? Почему?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Это грустные реалии typescript. При сборке вебпаком всё соберётся нормально, а вот для того чтобы IDE такое скушала - нужна персональна декларация(.d.ts) на каждый sass файл или общая но не информативная вида:
    declare module '*.scss' {
      const scss: any;
      export default scss
    }
    , чтоб он знал какие там где типы.

    Можно для автоматизации использовать такие штуки, но это всё такие костыли...
    Ответ написан
  • Как правильно использовать паттерн проектирования стратегия?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Если не хотите просто передавать сам класс стратегии как параметр, то остаётся только сделать жэшмапу где ключём будет имя параметра, а значением собсно класс стратегии. При добавлении новой стратегии - добавляеете её же в мапу. Условно как-то так:
    class FormBuilder {
        public static strategies: { [key: string]: {new(): IFormStrategy} } = {
            simple: SimpleFormStrategy,
            extended: ExtendedFormStrategy,
        };
        public build(params: { strategy: string }): Form {
            let strategy: IFormStrategy = new FormBuilder.strategies[params.strategy]();
            return strategy.execute(params);
        }
    }
    
    FormBuilder.strategies.custom = CustomFormStrategy;
    
    const formBuilder = new FormBuilder();
    formBuilder.build({ strategy: 'custosm' });

    Естесно мапу можно сделать приватной и добавление осуществлять публичным методом. Или хранить вообще отдельно. Нужны также проверки что такая стратегия вообще есть, но это всё уже детали...
    Ответ написан
    2 комментария
  • Как использовать this в стрелочной функции в typescript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Бессмысленно указывать тип this для стрелочной функции, потому что ts сам его прекрасно видит - там тупо не может быть никаких вариантов и разночтений: this для стрелочной функции задаётся прямо на месте её создания и принимать никаких иных значений не может.
    В PR вы попутали, там this используется не в стрелочной функции, а в типе свойства.
    Ответ написан
    1 комментарий
  • Как настроить абсолютный путь в typescript/webpack?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    В попробуй compilerOptions добавить что-то типа:
    "paths": {
      "src/*": [ "app/src/*" ]
    }
    Ответ написан
    Комментировать
  • Как заменить на interface?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Используйте вариант Robur.
    Почему? Потому что в общем смысле то чего вы хотите автоматически получить невозможно, т.к. порядок ключей в объекте(и интерфейсе) значения не имеет, т.е. нет никакой разницы меж:
    interface TestInterface {
      a: number;
      b: string;
      c: () => void;
    }
    и
    interface TestInterface {
      c: () => void;
      a: number;
      b: string;
    }
    а в функции, очевидно, имеет.

    Вручную можно сделать так:
    function test(a: TestInterface['a'], b: TestInterface['b'], c: TestInterface['c']): void {
      // ,,,
    }


    Если порядок аргументов таки значения не имеет - в принипе можно накошмарить сложный тип, с использованием ...args, но не нужно.)
    Ответ написан
    Комментировать