请问我如何在定义接口的时候, 接口的属性名是个变量?

新手上路,请多包涵

假设我有一个这样的函数

const func = (obj,key) => {
  console.log(obj[key])
}

我做了如下操作

const func = (obj:{
  [key:string]:any
},key:string) => {
  console.log(obj[key])
}

显然这样无法确保obj上我可以正确访问到变量key这个属性。

我如何使用TypeScript来确保我得到的参数obj上一定有key这个属性?

阅读 2.1k
3 个回答
✓ 已被采纳新手上路,请多包涵

感谢回答,最后深入发现keyof关键字可以获得最佳的实现效果。

const func1 = <T extends object>(obj:T, key:keyof T) => {
  return obj[key]
}

const person = {
  name:'allen',
  age:19
}

func1(person,'sex')
// error

把函数的入参通过接口来定义

interface obj {
    key: string,
    firstName: string
}

const func = (params: obj) => {
    console.log(params);
}

func({key: '1', firstName: '2'});

如果入参不满足接口定义类型,TS会报错
image.png

const func = <T extends string>(obj: Record<T, any>, key: T) => {
 return obj[key];
};

// 调用
func({a: ''}, 'a');

这样试试?

批注 2020-05-26 153939.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题