Skip to content

AsyncIterableX#pipe completely ignores types.  #377

@jeengbe

Description

@jeengbe

IxJS version: 7.0.0

Code to reproduce: https://codesandbox.io/p/sandbox/typescript-playground-export-forked-9jmsj9?workspaceId=ws_TdkXAMqyc14LovZfzuJaP6

import { AsyncIterableX, from } from "ix/asynciterable";
import { tap } from "ix/asynciterable/operators";
import {
  MonoTypeOperatorAsyncFunction,
  MonoTypeOperatorFunction,
} from "ix/interfaces";
import { IterableX } from "ix/iterable";

declare const sync: IterableX<number>;
declare const async: AsyncIterableX<number>;
declare const syncOp: MonoTypeOperatorFunction<string>;
declare const asyncOp: MonoTypeOperatorAsyncFunction<string>;

sync.pipe(syncOp);
//        ~~~~~~ Errors, as it should
async.pipe(asyncOp);
//         ^^^^^^^ No error!

// Demo, will crash at runtime
from([1, 2, 3]).pipe(tap((val: string) => val.length));

Expected behavior: The function signature should prevent piping an AsyncIterable<number> into an operator that expects string. The attached code demonstrates how this could end up bad.

Actual behavior: According to TS, the expression is a-ok for async iterables. Note that it works as intended for sync iterables.

Additional information:

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions