typescript使用decorator给类添加属性,报错是怎么回事?

配置:
{

"compilerOptions": { 
    "outDir": "./public/", 
    "sourceMap": true, 
    "noImplicitAny": true, 
    "module": "commonjs", 
    "target": "es5", 
    "jsx": "react" ,
    "allowJs" : true,
    "noImplicitAny": false,
    "suppressImplicitAnyIndexErrors": true,
    "experimentalDecorators" : true,
    "lib": ["es6", "es7", "dom"]

},
"files": [ "./index.tsx" ],
"exclude": [
    "node_modules"
]

}
代码:
@sets
class Home { }
function sets(target) {

target.prototype.age = 'aaa';

}
var home = new Home
console.log(home.age)

报错:

clipboard.png

但是用es7,同样的代码就可以使用。也不会报错。

阅读 3.4k
1 个回答

要给出Home的类型定义,还有你的配置文件里noImplicitAny项都重复了

====编辑====
可以定义一个命名空间,专门放置自定义的相关类型定义,假设命名空间名是"a";

// .d.ts
declare module 'a' {
    export class Home {
        age: string
    }
}

// 使用的时候
import * as a from 'a';
@sets
class Home extends a.Home {}
function sets(target) {
    target.prototype.age = 'aaa';
}
const home = new Home();
console.log(home.age);

// 如果不使用d.ts也可以直接在类里定义
class Home {
    public age: string;
}

只要不执行这行代码console.log(home.age),上面的代码编译都是通过的,如果访问了age属性,ts就会去校验Home类型定义

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题