如何使用flowtype&immutable.js声明包含某些属性的Map

Nih*_*hau 10 javascript flowtype immutable.js

给定一个像这样创建的网站对象

import {Map} from 'immutable' 
const website = new Map({name: 'My Website', url: 'http://www.myw.fr'})
Run Code Online (Sandbox Code Playgroud)

我怎么能声明一个websiteType,它将是一个包含完全给定属性的地图.我知道我能做到:

declare type websiteType = Map<string,string>
Run Code Online (Sandbox Code Playgroud)

但我想更具体一点,并声明一个必须包含属性nameurl类型的地图string.

它甚至可能吗?

Arw*_*ett 1

希望我的问题是正确的,因为我从未使用过“immutable”中的地图,因此我将使用es6 地图

你为什么不直接使用一个类呢?

class Website extends Map<string, string> {
    constructor(name: string, url: string) {
        super()
        this.set("name", name)
        this.set("url", url)
    }
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以像这样初始化它:

const website = new Website("awesome", "www.awesome.com")
Run Code Online (Sandbox Code Playgroud)

然后执行get和set操作。

如果错过参数 flowtype 将抛出错误。

我希望这能成为您的解决方案。

编辑:

您也可以创建一个初始化地图的函数。

declare type WebsiteType = Map<string, string>

function createWebsite(name: string, description: string) {
    const website: WebsiteType = new Map
    website.set("name", name)
    website.set("description", description)
    return website
}
Run Code Online (Sandbox Code Playgroud)

不过,我发现第一个解决方案更好,因为它为您提供了网站类型,并且您不必创建创建者功能。

编辑:

如果您想要与使用地图初始化相同的语法,您也可以这样做:

class Website extends Map<string, string> {
    constructor({name, url, ...rest}) {
        super()
        this.set("name", name)
        this.set("url", url)
        for(const name in rest) {
            this.set(name, rest[name])
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不过我认为第一个有意义。