Ответы пользователя по тегу TypeScript
  • Почему TypeScript не видит объект google?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Объект есть, нет его типов.
    npm i -D @types/google.maps
    Это указано первой же строчкой в документации.
    Ответ написан
    Комментировать
  • Почему TS ругается на точку запятой и как поправить правильно?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Extra semicolon.
    Лишняя точка с запятой.

    Как быть? Перенастроить eslint правило semi наоборот, чтобы точки с запятой были обязательны.
    Тот, кто не пишет точки с запятой - роет себе яму и уменьшает читабельность.
    Ответ написан
    2 комментария
  • Что не так тут с оператором void?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    ESlint правило кторое не любит "висящих в воздухе" Promise.
    Оно хочет чтоб ты сделал что-то из этого:
    methods: {
      openUnit(it: string):void {
        void this.$router.push(`/unit/${it}`);
      }
    }
    
    methods: {
      openUnit(it: string) {
        return this.$router.push(`/unit/${it}`);
      }
    }
    
    methods: {
      async openUnit(it: string) {
        await this.$router.push(`/unit/${it}`);
      }
    }


    Типа если Promise явно не обработан, возможно ты ошибся и пошёл выполнять код, не дождавшись его разрешения.
    Ответ написан
    Комментировать
  • Как читать дженерики в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Всё правильно. Квадратные скобки чтоб обозначить, что args - массив, в случае с any их можно выкинуть.
    Ответ написан
    2 комментария
  • Почему вылазит ошибка Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'EventStatusType'. в ts?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    let key: keyof EventStatusType;
    for (key in eventTypes) {
    Typescript не может автоматически вывести тип key потому что он структурный, и никак не может знать, что в объекте точно нет ещё каких-нибудь ключей, кроме тех что указаны в типе EventStatusType:
    const foo = {
       Closed: false,
       Maintaince: false,
       Open: false,
       внезапно: 'Вася'
    };
    
    const bar: EventStatusType = foo; // ok
    Поскольку с помощью кода в начале ты фактически говоришь Typescript: "я знаю лучше, там точно не будет ничего другого", то на всякий непредвиденный случай следует добавить в switch default который что-то сделает(например кинет ошибку) если таки лишний неведомый ключ прилетит.

    P,S. А ещё у тебя в имени одного ключа опечатка: Maintaince и Maintenance.
    Ответ написан
    Комментировать
  • Аргумент типа "never[] | undefined" нельзя назначить параметру типа "never".?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    initialState у тебя не типизирован, соответственно массив без указания типа имеет тип nexer[] - т.е. в него нельзя класть ничего вообще.
    Ответ написан
    Комментировать
  • Как запрашивать определенный тип в аргументах type union?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    type A = {
        name: '1'
    } | {
        name: '2'
    } | {
        name: '3'
    }
    
    type AMap =  {
      [K in A['name']]: (a: Extract<A, {name: K}>) => void
    }
    interface B extends AMap {}
    Ответ написан
    Комментировать
  • Как типизировать функцию, которая возвращает данные по ключам объекта?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    TS очень не любит работать с произвольными объектами, так что совсем без any получится огромное убожество имеющее одну цель - ублажить TS. Оно того не стоит.

    С any же всё просто, но надо быть аккуратным.
    function getPropertyOfObject<T extends Record<PropertyKey, any>>(obj: T) {
        const defaultKey = 'defaultKey';
        function getProp<K extends keyof T>(keyOne: K): typeof defaultKey extends keyof T[K] ? T[K][typeof defaultKey] : void;
        function getProp<K extends keyof T, K2 extends keyof T[K]>(keyOne: K, keyTwo: K2): T[K][K2];
        function getProp(keyOne: PropertyKey, keyTwo?: PropertyKey) {
            return obj?.[keyOne]?.[keyTwo ?? defaultKey];
        }
        return getProp;
    }
    Ответ написан
    Комментировать
  • Как исправить Element implicitly has an 'any'?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    1. accum у тебя {} - объект без типа. Задай ему тип: {} as SomeType. Как минимум сделай его словарём: {} as Record<string, IListTV>.

    2. Используй e.currentTarget - e.target в теории может быть каким-то вложенным элементом, а потому "не может быть" автоматически типизирован.
    Ответ написан
    Комментировать
  • Можно ли заставить Prettier ставить запятые в интерфейсах Typescript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    В чистом prettier - нет. В нём специально ограничен функционал, чтоб кашу не получить.

    P.S. Не понимаю я таких как ты удаляторов. Шанс получить косяк типа:
    console.log('some')
    
    
    // iterate
    [1, 2, 3].forEach(func)
    вообще не стоит экономии на спичках.
    Ответ написан
    Комментировать
  • Импорт child_process исчезает?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Всё, само собой, работает.

    Вот вам минимальный конфиг:
    package.json:
    {
      "name": "ts",
      "version": "1.0.0",
      "type": "module",
      "main": "index.js",
      "module": "index.js",
      "license": "MIT",
      "dependencies": {
        "typescript": "^4.4.4"
      },
      "devDependencies": {
        "@types/node": "^16.11.7"
      }
    }


    tsconfig.json:
    {
      "compilerOptions": {
        "target": "esnext",
        "module": "esnext",
        "esModuleInterop": true,
        "strict": true
      }
    }


    index.ts & результирующий index.js:
    import cp from "child_process";
    console.log(cp);


    Ищите отличия.
    Ответ написан
    Комментировать
  • Живые примеры type / interface?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Интерфейсы можно мержить (declaration merging) - потому их имеет смысл юзать для того, что может быть расширено кем-то другим.

    В остальном разницы не много.

    Ну и на типах можно программировать - потому их можно юзать для создания (излишне)хитрых, но удобных конструкций.)
    Ответ написан
    Комментировать
  • Почему JavaScript интерпретирует переменную цикла как типа string?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    TypeScript работает только на этапе компиляции. Если вы хотите использовать скомпилированную функцию в обычном javascript коде, то проверку на верность типа переданного аргумента вам надо осуществлять самостоятельно.
    Ответ написан
    Комментировать
  • Как рекурсивно принимать json через API?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Условно как-то так:
    useEffect(() => {
      const fetchData = async (url: string, data: any[] = []) => {
        const res = await fetch(url);
        const json = await res.json();
        if(json.pagination.links.next){
          await fetchData(json.pagination.links.next, data)
        }
        data.push(json.data);
        return data;
      };
      
      fetchData("https://gorest.co.in/public/v1/users").then(setData);
    }, [url]);

    в data будет массив.

    Кстати рекурсия тут не обязательна:
    useEffect(() => {
      const fetchData = async (url: string) => {
        let data: any[] = [];
    
        do {
          const res = await fetch(url);
          const json = await res.json();
    
          data.push(json.data);
    
          url = json.pagination.links.next;
        } while (url);
    
        return data;
      };
    
      fetchData("https://gorest.co.in/public/v1/users").then(setData);
    }, [url]);


    Ну и вместо any - расставить твои типы надо.
    Ответ написан
    3 комментария
  • Как сказать тайпскрипту что я жду обьект с нужными полями в jsx?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    export const Film = ({ film }: { film: IFilm ): ReactElement => {
      return <div></div>;
    };

    А лучше:
    export const Film: React.FC<{
      film: IFilm
    }> = ({ 
      film 
    }) => {
      return <div></div>;
    };
    Ответ написан
    1 комментарий
  • Можно ли так писать код?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Всякие детали - это дело вкуса, на опасности вам в комментах указали, как и на главную проблему:
    const dataPriceAndDividendsByTicker = await responsePriceAndDividendsByTicker.json();

    Однако вот тут стоит остановиться по-подробнее.
    Даже если вы "типизируете" напрямую возврат от сервера, нет никаких гарантий, что там придёт именно то, что надо. В таком случае вы просто "обанываете" TypeScript. Для всего приходящего с сервера стоит писать хотя-бы минимальный тайпгард.
    Ответ написан
    Комментировать
  • Как сделать перечисление интерфейсов typescript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    namespace ITMDB {
      export interface params {}; 
      export interface response {}; 
    }


    Можно и так:
    interface ITMDB {
      params: {}; 
      response: {}; 
    }

    Но тогда, увы, к конкретным ключам - только по литералам:
    ITMDB['response']
    Ответ написан
    2 комментария
  • Писать типы вначале или рассчитывать на вывод типов компилятором?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    На этот вопрос нет однозначного ответа.
    Мне нравится когда всё выводится само. Это приятно и удобно. Но нет никаких гарантий, что "само" выведется именно то, что нужно, и что ты где-то незаметно не накосячил. Потому в важных\сложных местах типы я пишу заранее. Но только в оных.

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

    Ну и есть религиозное течение "types first" но это, на мой вкус, мазахизм чистой воды. И совершенно не стоит мнимых выгод.
    Ответ написан
    Комментировать