Consider the following TypeScript code:

```
type operator<T> = (input:T) => T

const pipe = <T>(...operators:operator<T>[]) => (input:T):T => operators.reduce((output, f) => f(output), input)

const add2:operator<number> = x => x+2

const times3:operator<number> = x => x*3

console.log(pipe(add2, times3)(1))    //output 9

```

The pipe function simply pipes the input of one operator into the result of the next operator.

Now consider this new definition of the operator type:

```
type operator<T, U> = (input:T) => U

```

**How should the pipe function be rewritten** in order for the IDE to let me know if I am using the types correctly?

E.g.: consider these two operators:

```
const times3:operator<number, number> = x => x*3

const toStr:operator<number, string> = x => `${x}`

```

I would like this to work properly:

```
pipe(times3, toStr)(1)

```

And here I would like the IDE to warn me that the types are wrong:

```
pipe(toStr, times3)(1)

```

I can't figure this out, thank in advance.