Skip to content

Support the TypeScript satisfies operator #216

@JasonWeinzierl

Description

@JasonWeinzierl

The satisfies operator was added in TypeScript 4.9. Some rules need to handle TSSatisfiesExpression or else satisfies can cause false negatives.

For example, these do not cause errors:

// no-async-subscribe
of(42).subscribe((async () => {}) satisfies Function);

// no-floating-observables
of(42) satisfies Observable<number>;

// no-ignored-subscription
of(42).subscribe() satisfies Subscription;

// no-ignored-subscribe
of(42).subscribe({} satisfies Partial<Observer<number>>);

// no-ignored-takewhile-value
let flag = true;
const whilst = of(42).pipe(takeWhile((() => flag) satisfies Function));

// no-implicit-any-catch
throwError(() => new Error('Kaboom!')).pipe(
  catchError((error => {
    console.error(error);
    return of('Error occurred');
  }) satisfies (error: any) => ObservableInput<any>),
);

// no-misused-observables
[1, 2, 3].forEach((i => of(i)) satisfies (i: number) => Observable<number>);

// no-redundant-notify
const subject$ = new Subject<number>();
subject$.next(42);
subject$.error(new Error('Kaboom!'));
subject$.complete() satisfies void;

// no-sharereplay - this one does trigger, but with the wrong message (forbiddenWithoutConfig)
const shared$ = of(42).pipe(
  shareReplay({ refCount: true } satisfies ShareReplayConfig),
);
 
// no-unsafe-takeuntil
const notifier = new Subject<void>();
const b = of(42);
of(42)
    .pipe(
      takeUntil(notifier) satisfies OperatorFunction<number, number>,
      combineLatestWith(b),
    )
    .subscribe((value) => { console.log(value); });

I discovered this after stumbling upon francoismassart/eslint-plugin-tailwindcss#396

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesthelp wantedExtra attention is needed

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions