2

我打算制作一个集合来保存不同的应用程序范围的设置,比如今天的登录用户数量、谷歌分析跟踪 ID 等。所以我做了一个这样的架构:

options_schema = new SimpleSchema({
    key: {
        type: String,
        unique: true
    },
    value: {
    },
    modified: {
        type: Date
    }
});

现在主要的问题是我想value成为任何类型:数字、字符串、日期,甚至是自定义对象。虽然它必须存在,但不能存在null

但是它当然会因为不指定类型而生气。有解决方法吗?

4

1 回答 1

4

您可以为您的字段使用匹配模式type,这让您几乎可以做任何事情:

const notNullPattern = Match.Where(val => val !== null)
value : {
  type : notNullPattern
}

(见箭头功能

请注意,这将允许nullundefined.
以这种方式定义模式允许您在应用程序的任何地方使用它们,包括check

check({
  key : 'the key',
  modified : Date.now(),
  value : {} // or [], 42, false, 'hello ground', ...
}, optionsSchema)
Match.test(undefined, notNullPattern) //true
Match.test({}, notNullPattern) //true
Match.test(null, notNullPattern) //false

排除一个值的更一般的解决方案是:

const notValuePattern =
  unwantedValue => Match.Where(val => val !== unwantedValue))

其中的使用与上面类似:

Match.test(42, notValuePattern(null)) // true

请注意,由于使用身份运算符===,它会明显失败NaN

Match.test(NaN, notValuePattern(NaN)) // true :(

一个解决方案可能是:

const notValuePattern =
  unwantedValue => Match.Where(val => Number.isNaN(unwantedValue)?
    !Number.isNaN(val)
    : val !== unwantedValue
  )

如果您想要一个解决方案来排除架构中的某些特定值(与 的相反Match.OneOf),您可以使用以下内容:

const notOneOfPattern = (...unwantedValues) => 
  Match.Where(val => !unwantedValues.includes(val)
)

这使用Array.prototype.includes...扩展运算符。使用如下:

Match.test(42, notOneOfPattern('self-conscious whale', 43)) // true
Match.test('tuna', notOneOfPattern('tyranny', 'tuna')) // false
Match.test('evil', notOneOfPattern('Plop', 'kittens')) // true

const disallowedValues = ['coffee', 'unicorns', 'bug-free software']
Match.test('bad thing', notOneOfPattern(...disallowedValues)) // true
于 2015-10-09T10:32:18.857 回答