装饰器在编译es6后target、target.prototype是{}

来源:7-1 创建控制器和装饰器

莜紫兮

2021-11-05

import "reflect-metadata";

function tControll(target: any) {
  for (let key in target.prototype) {
    console.log(Reflect.getMetadata("path", target.prototype, key));
  }
}
function get(path: string) {
  return function (target: any, key: string) {
    Reflect.defineMetadata("path", path, target, key);
  };
}

@tControll
class controller {
  @get("/")
  getName() {
    console.log("lisi");
  }
}

老师为什么这段代码在编译成es6后 tControll 没有输出呢?

图片描述

图片描述

写回答

2回答

qq_慕运维0573241

2022-04-13

  // 这样的写法在编译成es2016的情况下无效
  // 因为class的内部所有定义的方法,都是不可枚举的,与 ES5 的行为不一致
  for (let key in target.prototype) {
    const data = Reflect.getMetadata('data', target.prototype, key)
    console.log(data)
  }
  
  
    // 编译成es2016的情况 可以这样写
      Object.getOwnPropertyNames(target.prototype).forEach((item: string) => {
        // 排除默认的constructor属性
        if (item !== 'constructor') {
          const data = Reflect.getMetadata('data', target.prototype, item)
          console.log(data)
        }
      })
           

下载视频          

3
4
化工转CS
回复
Jack_WJQ
回复 Jack_WJQ:因为我们其实把metadata存在path里而不是data, 把这位同学代码里面的data改成path就好用了
2025-01-08
共4条回复

Dell

2021-11-05

会影响代码执行吗

0
2
莜紫兮
视频中使用的react版本、react-router-dom版本相对较老,react-router-dom最新版本是6.0.0老的语法已经不支持了例如import { Switch } from 'react-router-dom'会提示 react-router-dom未暴露,应该是新版的react-router-dom移除了。Route 的组件 新版是} />, ε=(´ο`*)))唉踩了一点坑。 react-router-dom新版6.0.0中路由重定向不能使用Redirect了 需要使用import { useNavigate } from "react-router-dom"; but 会报错,目前还没找到好的解决办法,还需要在研究研究文档。~_~
2021-11-05
共2条回复

专为小白设计的TypeScript入门课

Dell老师专为TypeScript小白打造的,全栈式教学TS入门课程

2249 学习 · 506 问题

查看课程