function参数应该是对象的键类型之一的类型

时间:2018-05-16 07:06:12

标签: typescript

在打字稿中, 我有一个功能: -

   function updateSetting(settingName, settingValue: string[]| number | null) { 
      this.props.updateSetting({[settingName]}: settingValue)
  }

我也有一个对象,所以我有一个接口

   interface Setting {
      names: string[]
      city: string | null
      age: number
   }

所以,我想使用object作为参数,我也希望对象的一个​​属性作为参数传递,该参数在运行时决定。所以在我的函数中,settingName可以是'name'或'city'或'age',所以我想从界面本身分配类型。

我不想写(settingValue: string[]| number | null)我想写类似

的内容
settingValue: valueof Setting

因为设置值可以是任何类型names, city, age

我怎样才能在打字稿中实现这一目标?

2 个答案:

答案 0 :(得分:3)

如果你想设置settingValue的类型,你的动态界面可以尝试:

settingValue = keyof Setting ; // names| city | age

或者如果您想要设置密钥而不使用其类型:

MicroFinanceAssets <Directory>
    - node_modules <Directory>
    - angular-cli.json

答案 1 :(得分:2)

您可以更多地改进您的功能,而不仅仅是settingValue的类型,您还可以确保settingNamesettingValue一致:

function updateSetting<TKey extends keyof Setting>(settingName: TKey, settingValue: Setting[TKey]) {
    //...
}

interface Setting {
    names: string[]
    city: string | null
    age: number
}

updateSetting("names", [""])
updateSetting("age", [""]) //error

我们使用keyof运算符指定通用参数Tkey必须是字符串文字类型,它是Setting的te键之一,然后我们指定settingValue必须具有Setting字段对于给定键的任何类型,使用类型查询Setting[TKey]

如果通常使用常量键,这种方法可以确保更多类型的安全性。如果要传递任意字符串,则需要使用类型断言,settingValue的类型将与Setting[keyof Setting]相同:

let str;
updateSetting(str as keyof Setting, 0) //ok
updateSetting(str as keyof Setting, new Date()) //error