MST

星途 面试题库

面试题:TypeScript 装饰器在复杂继承结构中的行为及元数据传递

假设有一个基类 `BaseClass`,以及一个继承自它的 `SubClass`。在 `BaseClass` 上应用一个装饰器来添加元数据 'version': '1.0'。在 `SubClass` 上也应用一个装饰器,这个装饰器需要能够获取到 `BaseClass` 上的元数据,并添加自己的元数据 'feature': 'newFeature'。请实现这个功能,并解释装饰器在这种继承结构中的执行顺序和元数据传递的原理。
48.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
def add_base_metadata(func):
    def wrapper(*args, **kwargs):
        setattr(func, 'metadata', {'version': '1.0'})
        return func(*args, **kwargs)
    return wrapper


def add_sub_metadata(func):
    def wrapper(*args, **kwargs):
        base_metadata = getattr(func.__base__,'metadata', {})
        new_metadata = {'feature': 'newFeature'}
        new_metadata.update(base_metadata)
        setattr(func, 'metadata', new_metadata)
        return func(*args, **kwargs)
    return wrapper


@add_base_metadata
class BaseClass:
    pass


@add_sub_metadata
class SubClass(BaseClass):
    pass


print(SubClass.metadata)

装饰器执行顺序和元数据传递原理

  1. 装饰器执行顺序
    • 当定义类时,装饰器从最内层向外层应用。首先 BaseClassadd_base_metadata 装饰器装饰,在这个装饰器中,为 BaseClass 添加了 metadata 属性,值为 {'version': '1.0'}
    • 然后 SubClassadd_sub_metadata 装饰器装饰。在这个装饰器中,它先获取 BaseClassmetadata(通过 func.__base__ 访问基类),然后添加自己的元数据 {'feature': 'newFeature'} 并更新到 SubClassmetadata 属性中。
  2. 元数据传递原理
    • add_sub_metadata 装饰器中,通过 getattr(func.__base__,'metadata', {}) 获取基类 BaseClassmetadata。如果基类没有 metadata 属性,返回空字典。然后将自己的元数据与基类的元数据合并(通过 update 方法),并设置到子类 SubClass 上,从而实现了元数据从基类到子类的传递和扩展。