如何在允许字符串和字符串数组时告诉typescript参数绝对是一个数组

时间:2018-03-22 13:31:57

标签: typescript

我想知道如何让打字稿知道代码在功能上有效。

它说它可能是一个字符串,当我真的不确定如何可能。这是一个错误吗?或者我只是输错了什么?

示例:

const i18nInstance = {
    options: {defaultNS: 'common'}
}

const getInitialProps = (req: any, namespaces?: string | string[]) => {
  if (!namespaces) {
    namespaces = i18nInstance.options.defaultNS
  }
  if (typeof namespaces === 'string') {
    namespaces = [namespaces]
  }

  const initialI18nStore = req.i18n.languages.reduce((langs, lang) => {

    // typescript thinks namespaces could be a string, but it obviously will never be.

    langs[lang] = namespaces.reduce((ns, n) => {
      ns[n] = (req.i18n.services.resourceStore.data[lang] || {})[ns] || {}
      return ns
    }, {})
    return langs
  }, {})

  return {
    i18n: req.i18n,
    initialI18nStore,
    initialLanguage: req.i18n.language,
  }
}

3 个答案:

答案 0 :(得分:1)

我会将其重新分配给使用Connected to Test Cluster at 127.0.0.1:9042. [cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4] Use HELP for help. cassdba@cqlsh> SELECT station_name,arrival_timestamp FROm stackoverflow.arrival_time2 ; station_name | arrival_timestamp --------------+--------------------- Wellington | 2018-03-22 11:05:00 (1 rows) 类型创建的变量:

string[]

这一行还有另一个问题:

let nss: string[];

if (typeof namespaces === 'string') {
  namespaces = [namespaces];
}
nss = namespaces;

我认为这应该是

ns[n] = (req.i18n.services.resourceStore.data[lang] || {})[ns] || {}

ns[n] = (req.i18n.services.resourceStore.data[lang] || {})[n] || {} 是一个对象,因此无法用作密钥。

答案 1 :(得分:0)

| undefined添加到namespaces参数

考虑不要改变namespaces但是要创建单独的常量instaed

    const nss: string[] = !ns
    ? []
    : typeof ns === 'string'
        ? [ns]
        : ns

答案 2 :(得分:0)

你可以让编译器确保它是字符串。

const getInitialProps = (req: any, namespaces?: string | string[]) => {
  if (!namespaces) {
    namespaces = 'default';
  }
  if (typeof namespaces === 'string') {
    namespaces = [namespaces] as string[]
  }

  namespaces.concat();
}