混入
import axios from "axios"
import 'reflect-metadata'
interface A {
age: number
}
interface B {
name: string
}
let a: A = { age: 18 }
let b: B = { name: 'lily' }
let c = { ...a, ...b }
console.log(c)
let c2 = Object.assign({}, a, b)
class Logger {
log(msg: string) {
console.log(msg)
}
}
class Html {
render() {
console.log('render')
}
}
class App {
run() {
console.log('run')
}
}
type Custructor<T> = new (...args: any[]) => T
function pluginMinxins <T extends Custructor<App>>(Base: T) {
return class extends Base {
private Logger = new Logger()
private Html = new Html()
constructor(...args: any[]) {
super(...args)
this.Logger = new Logger()
this.Html = new Html()
}
run() {
this.Logger.log('run')
}
render() {
this.Logger.log('render')
this.Html.render()
}
}
}
const mixins = pluginMinxins(App)
const app = new mixins()
app.render()
类装饰器
const Base = (name: string) => {
const fn: ClassDecorator = (target) => {
console.log(target)
target.prototype.name = name
target.prototype.fn = () => {
console.log('xxx')
}
}
return fn
}
const Result = () => {
const fn: ParameterDecorator = (target,key,index) => {
Reflect.defineMetadata('key','result',target)
console.log(target,key,index)
}
return fn
}
const Get = (url: string) => {
const fn: MethodDecorator = (target, _, descriptor: PropertyDescriptor) => {
const key = Reflect.getMetadata('key',target)
axios.get(url).then((res)=> {
descriptor.value(key ? res.data[key] : res.data)
})
}
return fn
}
@Base('lily')
class Http {
@Get('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10')
getList(@Result() data: any) {
console.log(data)
}
}
const http = new Http() as any
console.log(http.name)
console.log(http.fn())
http.getList({})