如何为动态访问对象属性的函数添加TypeScript类型定义?
为JavaScript属性访问器函数添加TypeScript类型安全性
需求说明
我需要给下面这个JavaScript函数添加TypeScript类型定义,让它具备类型安全性:
function propertyAccessor(prop) { return obj => obj[prop] }
该函数的逻辑是:接收一个属性名prop,返回一个访问器函数;这个访问器函数接收对象后,会返回对象中prop对应的属性值。
已知obj和prop在编译期都是确定的,预期的正确用法如下:
// 正确用法 const accessedObj = { date: new Date() } const accessor = propertyAccessor('date') const goodAccess = accessor(accessedObj)
我希望类型定义能让TypeScript检测出对象不包含指定属性的错误用法,比如下面的代码应该无法通过编译:
// 错误用法(应编译报错) const accessedObj = { date: new Date() } const accessor = propertyAccessor('Helsinki') const badAccess = accessor(accessedObj) // 此处应提示错误
我的尝试及问题
我写了如下的TypeScript实现,但存在两个问题:
goodAccess的返回类型被推断为never,而它应该是Date或者至少是Dated[keyof Dated];- 上述的错误用法没有被检测出来,依然能通过编译。
我的实现代码:
function propertyAccessor<T extends object>(prop: string): (obj: T) => T[keyof T] { return (obj: T) => obj[prop as keyof T] } interface Dated { date: Date } const dated: Dated = { date: new Date() } // 应正常运行:dated包含date属性 let goodAccess = propertyAccessor('date')(dated) // 应编译报错:dated不包含Helsinki属性 let badAccess = propertyAccessor('Helsinki')(dated)
内容的提问来源于stack exchange,提问作者bleistift2
相关产品推荐
相关产品推荐

