nytimes / react-tracking

🎯 Declarative tracking for React apps.

Home Page:https://open.nytimes.com/introducing-react-tracking-declarative-tracking-for-react-apps-2c76706bb79a

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Class `get` ("getter") is not supported

tianyingchun opened this issue · comments

const resolvedValue = initializer
            ? Reflect.apply(initializer, this, [])
            : Reflect.apply(get, this, []);
          const decoratedValue = decorate(resolvedValue).bind(this);

if we need to decorator one property or getter()

  // member field.
  @track({ fieldName: 'fieldName' })
  private fieldName = 'fieldName';

  // getter
  @track({ getName: 'getter() getMyName' })
  private get getMyName() {
    return this.parentMethod() + 'my name';
  }

  private handleTrack = () => {
    console.log('handleTrack: property decorator:', this.getMyName, this.fieldName);
    return {
      result: '({} as any).name.handleTrack',
    };
  }

for property decorate will lazy execute, it will result in

const resolvedValue = initializer
            ? Reflect.apply(initializer, this, [])
            : Reflect.apply(get, this, []);

//  resolvedValue value will be string, 
//  but if we execute
const decoratedValue = decorate(resolvedValue).bind(this); 
// will aways return us a function.
 

so maybe we need to do some check here like below code:

const decoratedValue = isFunction(resolvedValue)
            ? decorate(resolvedValue, name).bind(this)
           // for getter, member field we need to direct evaluate this express. and get the final value to consumer.
            : Reflect.apply(decorate(() => resolvedValue, name), this, []);

Yes, that's quite possibly a bug. I don't think we've handled the use case for a getter. Feel free to submit a PR with a test case! 🙏