Closed
Description
I'm writing an API with life cycle methods that are called in a specific order. Each life cycle method can return a 'state' object that is passed to the next life cycle method. I would like the API to be strongly typed, and the type of the state parameters to be inferenced from the return type of the previous life cycle method.
TypeScript Version: 3.9.2, 4.0.0-dev.20200530
Search Terms:
chain inference inference parameter
Code
type Chain<R1, R2> = {
a(): R1,
b(a: R1): R2;
c(b: R2): void;
}
function test<R1, R2>(foo: Chain<R1, R2>) {
}
test({
a: () => 0,
b: (a) => 'a',
c: (b) => {
const x: string = b; // Type 'unknown' is not assignable to type 'string'.(2322)
}
});
Expected behavior:
No error.
Actual behavior:
Error 2322 on const x: string = b
Removing the a
parameter removes the error and works as expected, e.g.
// ...same as above...
test({
a: () => 0,
b: () => 'a',
c: (b) => {
const x: string = b; // no error
}
});
Explicitly providing the parameter type also works, e.g.
// ...same as above...
test({
a: () => 0,
b: (a: number) => 'a',
c: (b) => {
const x: string = b; // no error
}
});
Playground Link: