Ответы пользователя по тегу TypeScript
  • Можно ли учить TypeScript, не зная JavaScript(для бекенда)?

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

    @Interface
    Поделитесь для чего вам это нужно? Я не спрашиваю про реальную задачу, а скорее про демонстрационный код, подобный тому что вы привели.

    Единственная причина которая приходит мне в голову это: вам нужно объявить переменную, которая будет иметь более узкий тип чем Some, который вы хотите вывести автоматически, а не писать вручную, но при этом вы хотите иметь гарантию того итоговый тип является подтипом Some.

    Как один из вариантов решения, могу предложить это:
    interface Some {
        value: string | string[];
    }
    
    type Extends<E, T extends E> = T;
    
    const foo = {
        value: ['a', 'b'] // здесь всегда будет массив
    }
    foo as Extends<Some, typeof foo>;

    playground

    То есть объявление переменной состоит из 2 выражений: объявление переменной с автоматическим выводом типа и валидация полученного типа.

    P.s. к сожалению, просто foo as Some не отловит все, что нужно, например {value: ['a', 'b', 8]}
    Ответ написан
  • Как в TS получить тип, возвращаемого функцией результата?

    @Interface
    Если я все правильно понял то сигнатура runAgents должна стать чем-то вроде:
    async function runAgents<T extends IAgentList>(agents: T): Promise<ResolveResult<T>>

    где ResolveResult:
    type ResolveResult<T extends IAgentList> = {
        [key in keyof T]: T[key] extends IAgentBase<infer R> ? R : never;
    }


    Решение основанно на infer из TS 2.8: https://www.typescriptlang.org/docs/handbook/relea...

    Весь код (слегка измененный):
    spoiler
    type IItem = {type: 'IItem'};
    type IDataSet = {type: 'IDataSet'};
    export type IAgentList = {
        [key: string]: IAgentBase<any>;
    }
    
    export interface IAgents extends IAgentList {
        items: IItemsParser;
        page: IPageParser;
        parser: IWebParser;
    }
    
    export interface IAgentBase<T> {
        parse(): Promise<T>;
    }
    
    export interface IItemsParser extends IAgentBase<IItem[]> {
    }
    
    export interface IPageParser extends IAgentBase<IDataSet[]> {
    }
    
    export interface IWebParser extends IAgentBase<any> {
    }
    
    export interface IAgentsResult<T> {
        items?: IItem[];
        page?: IDataSet[];
        parser?: any;
    }
    
    type ResolveResult<T extends IAgentList> = {
        [key in keyof T]: T[key] extends IAgentBase<infer R> ? R : never;
    }
    
    // в реальности все иначе, написал для понимания желаемого результата
    async function runAgents<T extends IAgentList>(agents: T): Promise<ResolveResult<T>> {
        const result: ResolveResult<T> = {} as any;
        Object.keys(agents).forEach(
          async key => result[key as keyof T] = await agents[key as keyof T].parse()
        );
        return result;
    }
    
    async function main() {
        const agents : IAgents = {} as any;
        const result = await runAgents(agents)
        result // typed
    }
    Ответ написан
    1 комментарий
  • Property 'butlers' does not exist on type 'House'?

    @Interface
    А что вас смущает? У вас функция возвращает union тип. Значит там либо одно, либо другое. То есть набор полей у результата - это пересечение множества полей Mansion и House. В пересечении нет поля butlers.

    Если будете вручную приводить к типу as Mansion как говорит 0xD34F можете нарваться на runtime ошибку. TS вам все верно говорит.

    Вам нужно определиться, что делает ваша функция:
    - возвращаяет одно из двух - тогда она может вернуть House, а там действительно нет butlers
    - возвращает House и дополняет его butlers равным 10? Тогда возможно вам вообще нужен новый тип.

    Если вы хотите вернуть что-то, что одновременно и Mansion и House используйте &:
    function getProperty() : ( Mansion & House) {
    ...


    Такой код читается как "вернуть объект который одновременно и Mansion и House". При этом в типе будет объединение множеств полей Mansion и House

    P. S. если Mansion подвид House - можно использовать extends:
    interface House {
        bedrooms: number,
        bathrooms: number
    }
    interface Mansion extends House {
        butlers: number
    }
    Ответ написан
    Комментировать
  • Как настроить ts config и webpack?

    @Interface
    Скорее всего ругается TS. Добавьте в tsconfig.json соответствующие алиасы для ваших модулей. О том как, можно почитать тут https://www.typescriptlang.org/docs/handbook/modul...
    Ответ написан
    Комментировать
  • В чём принципиальный смысл PropTypes/TypeScript/Flow?

    @Interface
    Вы задаете очень общий вопрос, на который полно информации в интернете. Например вот статья: https://habr.com/post/326304/ .

    Вам не понятно в чем профит?
    - меньше ошибок при разработке
    - более адекватный intellisense
    - намного проще рефакторить
    - использовать сторонний код (тайпинги могут (но не должны) частично заменить доки)
    - генерация документации https://typedoc.org/
    - возможность вообще описать где-то сущности, а не опираться на их создание в коде
    и много всего еще.

    Или вы не согласны, что профит есть? Тогда аргументируйте с чем вы не согласны (относительно множества источников в интернете).
    Ответ написан
    1 комментарий
  • Как задать --type-check в Node проекте на TS?

    @Interface
    пробовали запускать ts-node так:
    ts-node --type-check ./app.js
    ?
    Ответ написан
    1 комментарий
  • TypeScript всё ещё актуален?

    @Interface
    TypeScript может начать умирать, если появится нативная типизация полноценная (явно не ближняя перспектива), или все переедут на WebAssembly или что-то похожее (тоже не скоро). На данный момент TypeScript идет в ногу с JS, но на 2 шага впереди + имеет арсенал фич, которых в JS не планируется завозить. Еще у TS могут начаться проблемы вида "разработчики его бросили", но это не связано с развитием js.
    Ответ написан
    Комментировать
  • Для чего нужно это указывать тип второй раз?

    @Interface
    То что идет после двоеточия - тип возвращаемого функцией значения. https://www.typescriptlang.org/docs/handbook/funct... Не очень понял про второй раз - первый это аргумент или return newSquare;. TS (современный по крайней мере) сам определит тип по такому return. Т.е. часть после двоеточия - необязательна, но добавляет наглядности
    P. s. это также поможет избежать ошибки при попытке сделать невалидный return внутри функции
    Ответ написан
    Комментировать