Search code examples
javascripttypescriptpromisemobxmobx-persist

TS error: Argument of type 'null' is not assignable to parameter of type 'Error | PromiseLike<Error | undefined> | undefined'.ts(2345)


I am using Mobx Persist Store that saves MobX Store to Local Storage.

The docs doesn't have a TS version so I modified 2 lines (one in readStore & another in writeStore which you can compare with https://github.com/quarrant/mobx-persist-store#with-mobx-6) to solve TS errors but that caused another error:

import {
    persistence,
    useClear,
    useDisposers,
    isSynchronized,
    StorageAdapter,
} from 'mobx-persist-store'

import { FrameItStore } from '@/store/index'

function readStore(name: string) {
    return new Promise<string>((resolve) => {
        const data = localStorage.getItem(name) || '{}'
        resolve(JSON.parse(data))
    })
}

function writeStore(name: string, content: string) {
    return new Promise<Error | undefined>((resolve) => {
        localStorage.setItem(name, JSON.stringify(content))
        resolve(null)
    })
}

export default persistence({
    name: 'FrameItStore',
    properties: ['counter'],
    adapter: new StorageAdapter({
        read: readStore,
        write: writeStore,
    }),
    reactionOptions: {
        // optional
        delay: 2000,
    },
})(new FrameItStore())

I am getting an error on the null in resolve(null) inside of writeStore.

Here's the error:

Argument of type 'null' is not assignable to parameter of type 'Error | PromiseLike<Error | undefined> | undefined'.ts(2345)

How can I solve it?


Solution

  • I think I solved it as I see no errors now. I had to remove JSON.parse from readStore as well as use resolve(undefined) instead of resolve(null) in writeStore like:

    import {
        persistence,
        useClear,
        useDisposers,
        isSynchronized,
        StorageAdapter,
    } from 'mobx-persist-store'
    
    import { FrameItStore } from '@/store/index'
    
    function readStore(name: string) {
        return new Promise<string>((resolve) => {
            const data = localStorage.getItem(name) || '{}'
            resolve(data)
        })
    }
    
    function writeStore(name: string, content: string) {
        return new Promise<Error | undefined>((resolve) => {
            localStorage.setItem(name, JSON.stringify(content))
            resolve(undefined)
        })
    }
    
    export const PersistState = persistence({
        name: 'FrameItStore',
        properties: ['counter'],
        adapter: new StorageAdapter({
            read: readStore,
            write: writeStore,
        }),
        reactionOptions: {
            // optional
            delay: 2000,
        },
    })(new FrameItStore())