Skip to content

Opting in to getter/setter usage still fails with 'Contravariant property incompatible with covariant use' #3191

@justin-calleja

Description

@justin-calleja

Flow version 0.37.4.

In the following code:

import appendQuery from 'append-query';
import { join } from 'path';
import TypeCastError from './errors/TypeCastError';

export type VersionableArgs = {
   instanceId: string,
   version: number
};

export default class Versionable {

  instanceId: string;
  version: number;
    
  constructor(args: VersionableArgs) {
    this.instanceId = args.instanceId;
    this.version = args.version;
  }

  set instanceId(val: any) {
    if (typeof val !== 'string') throw new TypeCastError('instanceId is expected to be a string');
    this.instanceId = val;
  }

  toUrl(basePath: string) {
    let x: string = join(basePath, this.instanceId);
    return appendQuery(x, {
      version: this.version
    });
  }

}

running flow check errors out with:

Potentially unsafe get/set usage. Getters and setters with side effects are potentially unsafe and disabled by default. You may opt-in to using them anyway by putting `unsafe.enable_getters_and_setters=true` into the [options] section of your .flowconfig.

Opting in to getter and setter usage still fails with:

src/Versionable.js:36
 36:     let x: string = join(basePath, this.instanceId);
                                        ^^^^^^^^^^^^^^^ property `instanceId`. Contravariant property `instanceId` incompatible with covariant use in
 36:     let x: string = join(basePath, this.instanceId);
                                        ^^^^^^^^^^^^^^^ property `instanceId`

this.instanceId is a string and join takes var args of type string… why does this error out?

I am side-stepping the issue with a // $FlowIssue comment before join usage.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions