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 request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions