向TypeScript中的函数添加动态getter/setter属性

向TypeScript中的函数添加动态getter/setter属性,typescript,Typescript,我正在尝试向函数添加getter/setter属性,TypeScript在尝试访问该属性之前不会抱怨 const obj:{[key:string]:string} = { blah: "ok", test: "yes" }; const func = (a:string):void => {}; for(const key in obj) { Object.defineProperty(func, key, { get()

我正在尝试向函数添加getter/setter属性,TypeScript在尝试访问该属性之前不会抱怨

const obj:{[key:string]:string} = {
  blah: "ok",
  test: "yes"
};

const func = (a:string):void => {};

for(const key in obj)
{
  Object.defineProperty(func, key, {
    get() { return obj[key]},
    set(a:string) {
      obj[key] = a;
    }
  });
}
console.log([func]); //good, shows function and new properties
console.log(func.blah); //error TS2339: Property 'blah' does not exist on type '(a: string) => void'.
我试图避免使用“any”和属性名作为类型声明


有什么提示吗?

您需要使用
as
func
的类型声明为包含要添加的属性的内容

带有来自
obj
的索引签名:

const func = ((a:string) => {}) as ((a:string) => void) & {[key:string]:string};
const func = ((a:string) => {}) as ((a:string) => void) & typeof obj;
使用来自obj的
类型的动态类型

const func = ((a:string) => {}) as ((a:string) => void) & {[key:string]:string};
const func = ((a:string) => {}) as ((a:string) => void) & typeof obj;
使用一些特定的属性集(可以是
blah
test
而不是任何
string
):


obj
被定义为
{[key:string]:string}
--我们只允许访问已知属性
func.blah
func.test
,还是要访问任何属性?基本上,您需要在添加属性之前声明
func
的类型:
const func=((a:string)=>{})as((a:string)=>void)&{[key:string]:string}谢谢。成功了。你能把它作为一个解决方案发布,这样我就可以投票了吗?很好的头像‘‘‘‘‘‘)