Size: a a a

TypeScript — русскоговорящее сообщество

2020 April 25

ЕЛ

Евгений Лабутин in TypeScript — русскоговорящее сообщество
понятное дело что не людей, слова удачнее не нашел, и все эти мелкие стейт менеджеры и и 100 тысяч скачиваний не наберут
источник

fe

from earth in TypeScript — русскоговорящее сообщество
uid
Эта особенность подробно описана в документации: Difference between the static and instance sides of classes.
Если коротко, implements проверяет только тип инстанса, то есть свойства инстанса ("поля класса") и прототипа; а конструктор и статические свойства — это отдельный тип самого класса.
Как дополнительно проверять тип конструктора, описано там же (пример: play).
спасибо! понятно, но это полный треш
формулировки в доке тоже конечно смешные

> Then, for convenience, we define a constructor function

охренеть convenience
источник

Б

Бобомурод in TypeScript — русскоговорящее сообщество
Всем привет!

class Queue<t> {  private data = [];  push = (item: T) => this.data.push(item);  pop = (): T => this.data.shift(); }

Что означает <t> ? И что за тип 'T' у item ?
источник

N

Nikolay in TypeScript — русскоговорящее сообщество
Бобомурод
Всем привет!

class Queue<t> {  private data = [];  push = (item: T) => this.data.push(item);  pop = (): T => this.data.shift(); }

Что означает <t> ? И что за тип 'T' у item ?
источник

Б

Бобомурод in TypeScript — русскоговорящее сообщество
Спс
источник

C☭

Chadwick ☭ in TypeScript — русскоговорящее сообщество
Привет! чем never отличается от void? не совсем понятно :(


https://www.youtube.com/watch?v=NtGkF9WwoIY&t=29m14s
источник

AY

Alexey Yurchenko in TypeScript — русскоговорящее сообщество
Можно как-то типизировать такое?

type Filter = {
 name?: {
    equalTo?: string,
    includes?: string,
 }
}

type FilterMap = { [key in keyof Filter]: string };

const filterMap1: FilterMap = {
 name: 'includes',
};

const filterMap2: FilterMap = {
 name: 'equalTo1', // error
};

такой тип понятно, что не работает
{ [key in keyof Filter]: keyof Filter[key] }
источник

SM

Stanislav Morozevich in TypeScript — русскоговорящее сообщество
@alexesDev я не спец особо, но получилось завести твой пример вот так:
type Filter = {
 name?: {
    equalTo?: string,
    includes?: string,
 }
}

type Foo = { [key in keyof Filter]: keyof Required<Filter>[key] };

const filterMapOk0: Foo = {
 name: 'equalTo',
};

const filterMapOk1: Foo = {
 name: 'includes',
};

const filterMapOk2: Foo = {
 name: undefined,
};

const filterMapError: Foo = {
 name: 'equalTo1',
};
источник

AY

Alexey Yurchenko in TypeScript — русскоговорящее сообщество
Stanislav Morozevich
@alexesDev я не спец особо, но получилось завести твой пример вот так:
type Filter = {
 name?: {
    equalTo?: string,
    includes?: string,
 }
}

type Foo = { [key in keyof Filter]: keyof Required<Filter>[key] };

const filterMapOk0: Foo = {
 name: 'equalTo',
};

const filterMapOk1: Foo = {
 name: 'includes',
};

const filterMapOk2: Foo = {
 name: undefined,
};

const filterMapError: Foo = {
 name: 'equalTo1',
};
🔥 спасибо, почти час с этим провозился
источник

SM

Stanislav Morozevich in TypeScript — русскоговорящее сообщество
У меня тоже будет вопрос, буду благодарен, если кто-то поможет)
источник

SM

Stanislav Morozevich in TypeScript — русскоговорящее сообщество
const countsHooksFactory = <T extends Function>(
 useCounts: T,
 mapper: ReturnType<T> /* There is an error */
): TUseCounts => isVisible => {
 const {
   filters,
   searchControl,
   subGeoFilters,
   urlParameter
 } = usePrepareValuesForCountsRequest();
 const { data, loading } = useCounts({
   skip: !isVisible,
   variables: {
     searchControl,
     filters,
     subGeoFilters,
     urlParameter
   }
 });
 return {
   counts: mapper(data),
   loading
 };
};

// Example of usage:
const useTripAdvisorRatingCounts = countsHooksFactory(useGetSrlTripadvisorRatingsFilterCountsQuery,
                                                     (data: /* I expect that this type will be infered*/) => data?.srl.mainFilter.taRating);


Добрый день, подскажите, как это заставить работать. Идея такая, что есть некая функция, к-я будет создавать Реакт хуки из других Реакт хуков.
Она принимает хук, к-й полностью типизирован и маппер, к-й должен обрабатывать возвращаемое значение из хука. Я ожидаю, что из-за того, что хук из
аргументов полностью типизирован, то в маппер должен приходить результат с выведенным типом, но тайпскрипт со мной не согласен. Что я делаю не так?
Может быть нужно как-то поменять апи самой функции countsHooksFactory? Спасибо.
источник

AY

Alexey Yurchenko in TypeScript — русскоговорящее сообщество
mapper: ReturnType<T>
точно не так должен быть описан

mapper: (val: ReturnType<T>) => ???
источник

SM

Stanislav Morozevich in TypeScript — русскоговорящее сообщество
Попробовал, не получилось(
Скорее всего я хочу странного, наверно, нельзя вывести тип соседнего аргумента, но вообще ошибка другая:
Type 'T' does not satisfy the constraint '(...args: any) => any'.
 Type 'Function' is not assignable to type '(...args: any) => any'.
   Type 'Function' provides no match for the signature '(...args: any): any'.

Если передавать вместо extends Function -> extends (...args: any) => any, то потом возвращаемый тип для маппера не выводится
источник

SM

Stanislav Morozevich in TypeScript — русскоговорящее сообщество
Если кому-то вдруг интересно, как решилась проблема, то опубликую решение, к к-му я пришёл
const countsHooksFactory = <
 T extends (...args: any) => { data: unknown; loading: boolean }
>(
 useCounts: T
) => (
 mapper: (val: ReturnType<T>['data']) => IFilterCount | IFilterCount[]
): TUseCounts => isVisible => {
 const {
   filters,
   searchControl,
   subGeoFilters,
   urlParameter
 } = usePrepareValuesForCountsRequest();
 const { data, loading } = useCounts({
   skip: !isVisible,
   variables: {
     searchControl,
     filters,
     subGeoFilters,
     urlParameter
   }
 });
 return {
   counts: mapper(data),
   loading
 };
};

const useTripAdvisorRatingCounts = countsHooksFactory(
 useGetSrlTripadvisorRatingsFilterCountsQuery
)(data => mapFilterToCountsMapper(data?.srl.mainFilter.taRating));

Типы для data выводятся
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ͅ ̤ ̬̪ in TypeScript — русскоговорящее сообщество
Присоединяюсь к вопросу. И от undefined тоже - в джс ведь это одно и то же
источник

АЗ

Андрей Звёздочка in TypeScript — русскоговорящее сообщество
˸̧̨ ͅBlack Akula˸̧̨ ͅ ̤ ̬̪
Присоединяюсь к вопросу. И от undefined тоже - в джс ведь это одно и то же
Семантикой
undefined - это вполне допустимое значение
void - показатель, что ничего передаваться не будет
never - то, что выполнение в этот участок кода никогда не попадёт
источник

UT

Unexpected Token in TypeScript — русскоговорящее сообщество
˸̧̨ ͅBlack Akula˸̧̨ ͅ ̤ ̬̪
Присоединяюсь к вопросу. И от undefined тоже - в джс ведь это одно и то же
Я вижу это так:
Тип never можно использовать чтобы обозначить что до данного участка кода никогда не дойдет например в функции
const foo = (): never => {
 while (true) {
   // ... Some code
 }
};

Или
co
nst bar = (): never => {
 throw new Error('Not implemented yet');
}
А
void альтернатива (алиас) для undefined
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ͅ ̤ ̬̪ in TypeScript — русскоговорящее сообщество
А есть более формальный ответ? А то на уровне интуиции плохо понимать компилятор
источник

UT

Unexpected Token in TypeScript — русскоговорящее сообщество
˸̧̨ ͅBlack Akula˸̧̨ ͅ ̤ ̬̪
А есть более формальный ответ? А то на уровне интуиции плохо понимать компилятор
Компилятор? Как бы здесь нет такого, есть транспайлер с тайпчекером но не компилятор
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ͅ ̤ ̬̪ in TypeScript — русскоговорящее сообщество
Unexpected Token
Компилятор? Как бы здесь нет такого, есть транспайлер с тайпчекером но не компилятор
Я не хочу углубляться в детали
источник