如何在TypeScript云函数中声明带动态键的字典?
解决TypeScript中动态键字典的声明问题
嗨,刚上手TypeScript遇到这种动态键的小问题太正常啦,我来给你捋清楚怎么解决~
首先你遇到的第一个问题:
const payload = { messageId : 1 }
这里的messageId会被当成字符串字面量键,而不是你变量里的那个ID值,所以最终对象的键是'messageId',不是context.params.messageId的实际内容,这肯定不是你想要的。
然后你尝试的模板字符串写法编译失败,是因为没用到TypeScript(其实是ES6)支持的计算属性名语法,只要给动态键套上方括号就搞定了!
正确写法1:直接用变量作为动态键
const messageId = context.params.messageId; // 比如值是'-dbaASfcaer' const payload = { [messageId]: 1 }; // 现在键就是'-dbaASfcaer'啦 const promise = ref.update(payload);
方括号里可以放任何JavaScript表达式,所以如果需要给键加前缀后缀,用模板字符串也完全没问题:
const payload = { [`msg-${messageId}`]: 1 }; // 键变成'msg-dbaASfcaer'
可选:给字典添加类型声明
如果需要明确这个payload的类型(TypeScript的优势之一嘛),可以用两种方式:
- 自定义索引类型:
type MessageDict = { [key: string]: number }; const payload: MessageDict = { [messageId]: 1 };
- 用TypeScript内置的
Record工具类型:
const payload: Record<string, number> = { [messageId]: 1 };
这两种写法都表示“一个键为字符串、值为数字的字典”,根据你的喜好选就行。
为啥你之前的模板字符串写法失败?
你写的{ ${messageId} : 1 }没有用方括号包裹动态键,TypeScript会把${messageId}当成无效的对象键标识符,所以编译报错。只要改成{ [${messageId}]: 1 }就可以正常编译了~
内容的提问来源于stack exchange,提问作者Tal Zion
相关产品推荐
相关产品推荐

