在打字稿中, 我有一个功能: -
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
。
我怎样才能在打字稿中实现这一目标?
答案 0 :(得分:3)
如果你想设置settingValue的类型,你的动态界面可以尝试:
settingValue = keyof Setting ; // names| city | age
或者如果您想要设置密钥而不使用其类型:
MicroFinanceAssets <Directory>
- node_modules <Directory>
- angular-cli.json
答案 1 :(得分:2)
您可以更多地改进您的功能,而不仅仅是settingValue
的类型,您还可以确保settingName
和settingValue
一致:
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