Redux - создать магазин.Аргумент типа не может быть назначен параметру типа 'DeepPartial <any>' - PullRequest
0 голосов
/ 07 октября 2018

Когда я начинаю компиляцию, я всегда получаю ошибку стека.Который говорит, что мой initialState в store сломан или кто-то еще.Более того, мое приложение компилируется нормально, если я просто отключил initialState prop от store, но это не очень хорошие решения.

Я также признаю, что он нормально работает на .js версии файла приложения.Похоже, у редукса есть некоторые проблемы с TypeScript.

Ошибка:

TS2345: Аргумент типа '{titleSwitch: string;} 'нельзя назначить параметру типа' DeepPartial '.Свойство titleSwitch несовместимо с подписью индекса.Тип 'string' нельзя назначить типу 'DeepPartial'.

Моя часть кода:

import { createStore } from 'redux'
import reducer from './reducers'

const initialState = {
  titleSwitch: false
}

const store = () => {
  return createStore(
    reducer,
    initialState // TS Error
  )
}

Проверено на:

"redux": "^4.0.0",
"typescript": "^3.1.1",
"webpack": "^4.16.5"

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

Я думаю, что ответ Сесилеса хороший.Я просто хотел бы добавить, что тип DeepPartial является своего рода рекурсивным Partial, который действительно хорошо работает, когда вы используете несколько редукторов в сочетании с combineReducers.Ваш случай в основном слишком тривиален для типичного состояния редукции, потому что листья состояния не являются объектами, которые могут быть «частично» выделены.

Так что да, для этого случая с игровой площадкой TS не представляет большой ценности.Как только ваше состояние и редукторы станут более сложными, проверка типов должна снова работать очень хорошо, и вы можете удалить any-cast.

0 голосов
/ 24 мая 2019

Это из-за несоответствия типов, вероятно, между редуктором и initialState.

Для меня это было потому, что я использовал слишком общий интерфейс для action в редукторе:

interface FluxStandardAction {
  type: string
  payload?: any
  error?: boolean
  meta?: any
}

Таквозвращаемое значение редуктора action.payload было типа any, когда оно должно быть типа string

См. https://redux.js.org/recipes/usage-with-typescript

0 голосов
/ 07 октября 2018

Если код работает в JS, но не работает только из-за ввода в TypeScript, я бы предложил вам использовать «any», чтобы игнорировать его:

const store = () =>
  createStore(
    reducer,
    initialState as any
  )

Теперь вы спросите меня:но почему???В чем смысл TypeScript, если вы просто обойдете проблемы, когда захотите.

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

  • Либо это поможет вам избежать ошибок, упростив разработку, и это реальная мотивация для строгой типизации
  • Либо это играет против вас, мешая вам делать что-то законное в JS, этоне сделает ваш код более надежным, потому что рассматриваемый код - это то, чего вы никогда не трогаете (иными словами: если использование правильного набора текста ничего не меняет в результате)

TypeScript былизобретен с гибкостью в уме , и это делает его истинной силой при взаимодействии с библиотеками JS.Использование совершенной и строгой типизации везде имеет смысл только для языков, которые были разработаны таким образом с самого начала, и это не относится к JS.

Теперь не поймите меня неправильно.Я уверен, что есть решение вашей проблемы.Мои рассуждения больше о том: нужно ли вам это решать?Принесет ли это что-то полезное в ваше приложение?Иногда это не стоит того.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...