gpt4 book ai didi

node.js - 使用 Object.defineProperty 后如何读取 typescript 中的属性?

转载 作者:行者123 更新时间:2023-12-05 03:27:49 25 4
gpt4 key购买 nike

我有 following code on typescript playground出现了一些我不确定如何开始工作的问题

class PathInfo {
functionName: string;
httpPath: string;
httpMethod: string;

constructor(functionName: string, httpPath: string, httpMethod: string) {
this.functionName = functionName;
this.httpPath = httpPath;
this.httpMethod = httpMethod;
}

toString(): string {
return "PathInfo["+this.functionName+","+this.httpPath+","+this.httpMethod+"]";
}
}

class AuthRequest {}
class AuthResponse {}
class LoginRequest {}
class LoginResponse {}

const path: any = (thePath: string, type: any) => {
return (target: Function, memberName: string, propertyDescriptor: PropertyDescriptor) => {
const pathMeta = new PathInfo(memberName, path, type);

Object.defineProperty(target, memberName+'pathInfo', {
value: pathMeta,
writable: false
});

//How do I access the stored pathMeta
//console.log("target="+target.pathInfo);
console.log("member="+memberName);
console.log("props="+propertyDescriptor);
}
}

class AuthApiImpl {
@path("/authenticate", AuthResponse)
authenticate(request: AuthRequest): Promise<AuthResponse> {
throw new Error("all this is generated by factory.createApiImpl");
}
@path("/login", LoginResponse)
login(request: LoginRequest): Promise<LoginResponse> {
throw new Error("all this is generated by factory.createApiImpl");
}
};

function printMethods(obj: any) {
console.log("starting to print methods");

for (var id in obj) {
console.log("id="+id);
try {
//How do I access the stored pathMeta here FOR EACH METHOD ->
//console.log("target="+target.pathInfo);
if (typeof(obj[id]) == "function") {
console.log(id+":"+obj[id].toString());
}
} catch (err) {
console.log(id + ": inaccessible"+err);
}
}

}

console.log("starting to run")

const temp = new AuthApiImpl();
printMethods(temp);

console.log("done")
  • 第64-65行,如何读取我设置的属性
  • 第40-41行,如何读取我设置的属性
  • 第 58-74 行,为什么没有打印任何函数?我想打印所有函数,我不想打印属性(只是函数)
  • 第 33 行,此时我可以访问类名吗?
  • 第 35 行,我认为目标是一个函数并且会被授权,然后登录,但是如果我将属性定义为 JUST 'pathInfo',我会得到一个错误,指出该属性已经在目标上定义(这意味着目标类不是函数吗?)。我很困惑。

非常抱歉,因为我试图专注于一个问题,但是在我深入 typescript 世界的过程中,这个编写装饰器的测试给了我更多的问题而不是答案。

如何调整代码以在此处播放更多内容?

这里的目标是当开发人员定义其他微服务的 API 时,我可以捕获一堆元信息并将其存储在某个地方,以便稍后在启动代码中使用。我不关心我真正存储它的位置,但只需要一种清晰的方式来了解我想要扩展的类、方法、返回类型、http 路径等。

最佳答案

如何获取类的方法

即使你去掉装饰器,你仍然无法获取方法名。这不是特定于 TypeScript 的问题。

您需要获取原型(prototype)的属性,而不仅仅是对象本身。

function printMethods(obj: any) {
console.log("starting to print methods");

const objProto = Object.getPrototypeOf(obj);
console.log(Object.getOwnPropertyNames(objProto));
}

如何访问类名

目前不认为装饰器可以做到这一点,但将类名作为字符串传递应该很简单。

类似问题:TypeScript class decorator get class name

在 GitHub 上打开问题:https://github.com/microsoft/TypeScript/issues/1579

“属性已在目标上定义”

请注意,如果您运行上面的代码,您会在 console.log 中得到以下内容:

["constructor", "authenticate", "login", "authenticatepathInfo", "loginpathInfo"]

我还想指出,如果您甚至不初始化该类的实例,您仍然会遇到同样的错误。

关于node.js - 使用 Object.defineProperty 后如何读取 typescript 中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71371216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com