Ответы пользователя по тегу TypeScript
  • Как лучше типизировать параметры у функции?

    @twoone
    Если опустить тот факт что параметры функции сложения обязанны быть определенны как обязательные, то конкретно тип undefined можно заменить опционалыным модификатором ? .

    function а (a?: number, b?: number) {}

    В остальном параметры функции декларации описать невозможно. Другое дело функциональное выражение которое можно описать с помощью типа.

    Для псевдонима
    type Sum = (a?: number, b?: number) => number;

    Для интерфейса
    interface ISum { (a?: number, b?: number): number; }


    И использование
    const sum: Sum = (a, b) => a + b;
    Ответ написан
    Комментировать
  • Почему это не работает?

    @twoone
    У вас возвращаемое из функции значение принадлежит к чистому типу T у которого отсутствуют признаки типа ITest, о чем и говорит ошибка. Это вы думаете что с помощью аргументов типа конкретизировали возвращаемое функцией значение. То есть вы смотрите как-бы из вне. Но компилятору необходимо сопоставить типы внутри самой функции. Выполняя это он и обнаруживает несоответствие типа { testField: number } типу T.

    Советовать что-либо сложно, поскольку в таком контексте не понятно что вы хотите добится.
    Ответ написан
    Комментировать
  • Как задать тип параметру функции?

    @twoone
    Можно вот так -
    interface StateProps {
        a: number;
        b: string;
        c: boolean;
    }
    
    interface Action<P> {
        payload: Partial<P>;
    }
    
    const f = <P>(state: P, { payload }: Action<P>): P => ({
        ...state,
        ...payload,
    });
    
    let nextState = f(
        { a: 0, b: '', c: true },
        { payload: { c: false } }
    );


    Единственное нужно помнить что универсальные функциональные функции являются не допустимыми конструкциями в файлах с расширением .tsx.
    Ответ написан
    1 комментарий
  • Как вызвать функцию класса через списки в typescript?

    @twoone
    Причина описана в тексте ошибки. Вам необходимо использовать кортеж.

    class Flintstone {
        say() {
            console.log(` Yabba-Dabba Do`);
        }
    }
    let fred = new Flintstone();
    let list =['say'] as const;
    fred[list[0]];


    Тоже самое можно сделать с помощью enum или const enum

    class Flintstone {
        say() {
            console.log(` Yabba-Dabba Do`);
        }
        go() {
            
        }
    }
    let fred = new Flintstone();
    
    const enum FlintstoneMethod {
        Say = `say`
    }
    
    let keys: FlintstoneMethod[] = [FlintstoneMethod.Say];
    fred[keys[0]]();


    Кроме того получение ключей членов класса можно автоматизировать. Но это уже в тех случах когда вы сами понимаете для чего и когда это нужно.
    Ответ написан
    Комментировать
  • Как исправить ошибку при декларации графики в Typescript?

    @twoone
    Для объявления пользовательских деклараций в корне проекта принято создавать директорию types, в которой для каждого покета создаетя поддиректоория содержащая файл index.d.ts. Имя поддиректории задается исходя из име пакета. В вашем случаи будет так ./types/svg/index.d.ts

    Для декларирования расширения достаточно объявления безтелесной декларации -
    declare module "*.svg";

    Осталось лишь указать путь до директории types вtsconfig.json в массиве "typeRoots": ["./types"]

    Для компилятора этого достаточно. Что косается поля include, по оно содержит массив путей для файлов участвующих в компиляции и в большинстве случаев объявляется совместно с полем exclude. В паре они помогают оптимизировать процесс компиляции.
    Ответ написан
    1 комментарий
  • Как остановить interval в RxJS?

    @twoone
    Rxjs потрясающая библиотека позволяющая реализовывать любые сценарии, но требующая мышления абстракциями продвигаемой ею идеалогией. И если я правильно понял ваш случай, то проще всего применить оператор take.

    Ответ написан
    Комментировать