You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为动态访问对象属性的函数添加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实现,但存在两个问题:

  1. goodAccess的返回类型被推断为never,而它应该是Date或者至少是Dated[keyof Dated];
  2. 上述的错误用法没有被检测出来,依然能通过编译。

我的实现代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:05:24