Size: a a a

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

2020 March 05

M中

Mikhail 才藤 中村 Bashurov in TypeScript — русскоговорящее сообщество
источник

ТФ

Татьяна Фомина in TypeScript — русскоговорящее сообщество
как здесь правильно затипизировать payload, он разный у разных экшенов, и у некоторых его вообще нет. или тут лучше задать type IAction = { type: ActionType }; и для всех остальных экшенов написать свои типы, расширяющие этот?

interface IAction {
   type: ActionType;
   payload?: any;
}

/*type IAction = {
   type: ActionType;
};*/

enum ActionType {
   LoadDataInit = 'LoadDataInit',
   LoadDataSuccess = 'LoadDataSuccess',
   LoadDataError = 'LoadDataError',
   UpdateData = 'UpdateData',
   ToggleModal = 'ToggleModal',
   GoBack = 'GoBack',
   GoBackWithConfirmation = 'GoBackWithConfirmation',
   SetIsLoading = 'SetIsLoading',
   SaveSuccessWithExit = 'SaveSuccessWithExit',
   SaveSuccessWithRedirect = 'SaveSuccessWithRedirect',
   SaveSuccess = 'SaveSuccess',
}

const initialData: IOperationPlan = {
   id: '',
};

const reducer: React.Reducer<IState, IAction> = (state, action) => {
   const { data, value, isLoading, redirectId } = action.payload;

   switch (action.type) {
       case ActionType.LoadDataInit:
источник

EG

Egor Gorbachev in TypeScript — русскоговорящее сообщество
Татьяна Фомина
как здесь правильно затипизировать payload, он разный у разных экшенов, и у некоторых его вообще нет. или тут лучше задать type IAction = { type: ActionType }; и для всех остальных экшенов написать свои типы, расширяющие этот?

interface IAction {
   type: ActionType;
   payload?: any;
}

/*type IAction = {
   type: ActionType;
};*/

enum ActionType {
   LoadDataInit = 'LoadDataInit',
   LoadDataSuccess = 'LoadDataSuccess',
   LoadDataError = 'LoadDataError',
   UpdateData = 'UpdateData',
   ToggleModal = 'ToggleModal',
   GoBack = 'GoBack',
   GoBackWithConfirmation = 'GoBackWithConfirmation',
   SetIsLoading = 'SetIsLoading',
   SaveSuccessWithExit = 'SaveSuccessWithExit',
   SaveSuccessWithRedirect = 'SaveSuccessWithRedirect',
   SaveSuccess = 'SaveSuccess',
}

const initialData: IOperationPlan = {
   id: '',
};

const reducer: React.Reducer<IState, IAction> = (state, action) => {
   const { data, value, isLoading, redirectId } = action.payload;

   switch (action.type) {
       case ActionType.LoadDataInit:
В доке же всё есть: https://redux.js.org/recipes/usage-with-typescript/
источник

NS

Nikita Stenin in TypeScript — русскоговорящее сообщество
Татьяна Фомина
как здесь правильно затипизировать payload, он разный у разных экшенов, и у некоторых его вообще нет. или тут лучше задать type IAction = { type: ActionType }; и для всех остальных экшенов написать свои типы, расширяющие этот?

interface IAction {
   type: ActionType;
   payload?: any;
}

/*type IAction = {
   type: ActionType;
};*/

enum ActionType {
   LoadDataInit = 'LoadDataInit',
   LoadDataSuccess = 'LoadDataSuccess',
   LoadDataError = 'LoadDataError',
   UpdateData = 'UpdateData',
   ToggleModal = 'ToggleModal',
   GoBack = 'GoBack',
   GoBackWithConfirmation = 'GoBackWithConfirmation',
   SetIsLoading = 'SetIsLoading',
   SaveSuccessWithExit = 'SaveSuccessWithExit',
   SaveSuccessWithRedirect = 'SaveSuccessWithRedirect',
   SaveSuccess = 'SaveSuccess',
}

const initialData: IOperationPlan = {
   id: '',
};

const reducer: React.Reducer<IState, IAction> = (state, action) => {
   const { data, value, isLoading, redirectId } = action.payload;

   switch (action.type) {
       case ActionType.LoadDataInit:
Для таких вещей можно использовать typesafe-actions или typescript-fsa
источник

ТФ

Татьяна Фомина in TypeScript — русскоговорящее сообщество
Nikita Stenin
Для таких вещей можно использовать typesafe-actions или typescript-fsa
интересно
источник

EG

Egor Gorbachev in TypeScript — русскоговорящее сообщество
Nikita Stenin
Для таких вещей можно использовать typesafe-actions или typescript-fsa
В redux это из коробки уже: https://redux-toolkit.js.org/api/createaction/
источник

I

InvalidHuman in TypeScript — русскоговорящее сообщество
Egor Gorbachev
В redux это из коробки уже: https://redux-toolkit.js.org/api/createaction/
это же отдельный пакет
источник

ТФ

Татьяна Фомина in TypeScript — русскоговорящее сообщество
редакса нет
источник

EG

Egor Gorbachev in TypeScript — русскоговорящее сообщество
InvalidHuman
это же отдельный пакет
Да, но ментейнеры редакса позиционируют его как "standard way to write Redux logic"
источник

M

Maxim in TypeScript — русскоговорящее сообщество
Всем привет, как лучше расширить в данном случае:

расширяю монгусовский документ, там есть поле _id которое изначально обязательное и может быть any. Я, расширяя указываю тип поля, и помечаю его как не обязательное, так как при создании он генерируется сам. Теперь тс ругается на то, что я неправильно расширил, указав _id не обязательным. Как лучше поступить?
источник

M

Maxim in TypeScript — русскоговорящее сообщество
Или это просто монгусовский d.ts файл кривой, и ничего нормального с этим не сделать?)
источник

s

sandwich in TypeScript — русскоговорящее сообщество
Всем привет, вопрос по код-стайлу. Отделяете ли вы энамы и типы в отдельные папки/файлы от интерфейсов? Если да то для энамов и типов отдельные папки?
источник

DZ

Dmitriy Zavgorodniy in TypeScript — русскоговорящее сообщество
Maxim
Всем привет, как лучше расширить в данном случае:

расширяю монгусовский документ, там есть поле _id которое изначально обязательное и может быть any. Я, расширяя указываю тип поля, и помечаю его как не обязательное, так как при создании он генерируется сам. Теперь тс ругается на то, что я неправильно расширил, указав _id не обязательным. Как лучше поступить?
вы не можете "ослабить" тип указав его опциональным. так можно только "усилить" тип, делая из него, ранее опционального, ныне обязательным

чтобы сделать то что вам хочется, можете попробовать вот так:

type MyType = string | number;

interface Document {
   _id: any;
   key: string;
   other_key: boolean;
   // Прочие ключи из внешнего интерфейса
}

// Partial делает все ключи из переданного ему интерфейса опциональными
interface IDoc extends Partial<Document> {
   // тут уже полность ваш интерфейс и вы можете как переопределять типы этих ключе
   // так и выбирать какие ключи сделать обязательными, а какие оставить опциональными
   _id?: MyType,
   // и так далее
}

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

M

Maxim in TypeScript — русскоговорящее сообщество
Dmitriy Zavgorodniy
вы не можете "ослабить" тип указав его опциональным. так можно только "усилить" тип, делая из него, ранее опционального, ныне обязательным

чтобы сделать то что вам хочется, можете попробовать вот так:

type MyType = string | number;

interface Document {
   _id: any;
   key: string;
   other_key: boolean;
   // Прочие ключи из внешнего интерфейса
}

// Partial делает все ключи из переданного ему интерфейса опциональными
interface IDoc extends Partial<Document> {
   // тут уже полность ваш интерфейс и вы можете как переопределять типы этих ключе
   // так и выбирать какие ключи сделать обязательными, а какие оставить опциональными
   _id?: MyType,
   // и так далее
}

только хорошо подумайте, нужно ли вам это, т.к. дальше в приложении вы должны будет сами поддерживать актуальность интерфейсов при обновлениях
да и как бы разрабы пакета не просто ж так описали интерфейсы именно так
Не знал про Partial, спасибо! Да, согласен, что нужно подумать конечно, но по поводу авторов, к сожалению пока @types/mongoose не покрывает монгус полностью, часто юзается any и много не покрытых методов, поэтому в данном случае не могу пологаться на авторов пакета
источник

DZ

Dmitriy Zavgorodniy in TypeScript — русскоговорящее сообщество
при желании вы сами можете быть одним из соавторов @types/mongoose и сделать жизнь себе и людям чуточку проще :)
но тут уже выбор лично каждого: тратить ли время в opensource ^_^
источник

DZ

Dmitriy Zavgorodniy in TypeScript — русскоговорящее сообщество
Maxim
Не знал про Partial, спасибо! Да, согласен, что нужно подумать конечно, но по поводу авторов, к сожалению пока @types/mongoose не покрывает монгус полностью, часто юзается any и много не покрытых методов, поэтому в данном случае не могу пологаться на авторов пакета
рад что смог помочь :)
источник

s

shashkov0 in TypeScript — русскоговорящее сообщество
Подскажите плиз что я делаю не так. У меня есть 4 типа модалок, в зависимости от типа меняются пропсы внутреннего компонента. Сейчас выдается ошибка Type '{ onClose: () => void; message?: string | undefined; buttonTitle?: string | undefined; }' is missing the following properties from type 'Props': onConfirm, cardNumber, amount, date, isRecurrent
источник

s

shashkov0 in TypeScript — русскоговорящее сообщество
То есть он мне в ошибке пишет мол у тебя вот пропсы для этого типа модалки есть (что верно), а пропсов для модалок других типов нет
источник

s

shashkov0 in TypeScript — русскоговорящее сообщество
Вот весь текст ошибки
источник

P@

Pavel @nodkz in TypeScript — русскоговорящее сообщество
Дополнил их ишью своим кейсом https://github.com/microsoft/TypeScript/issues/12936#issuecomment-595140797

Тереблю их в твиттере (ваш лайк или ретвит - лишний раз заставит Дэниэля глянуть на эту проблему): https://twitter.com/nodkz/status/1235456980996800512?s=19
источник