DEV Community

Discussion on: Advanced TypeScript Exercises - Question 3

Collapse
 
kashyaprahul94 profile image
Rahul Kashyap • Edited

A quick idea -

function f<T extends string | number>(a: T, b: T) {
    if ( typeof a === "string" ) {
        return a + ':' + b; // no error but b can be number!
    } else {
        return a as number + (b as number); // error as b can be number | string
    }
}

f(2, 3); // correct usage
f(1, 'a'); // should be error
f('a', 2); // should be error
f('a', 'b') // correct usage

Playground link

Collapse
 
macsikora profile image
Pragmatic Maciej

Nice, thanks but your code still doesn't compile, can you make a version which compiles? - Playground

Collapse
 
kashyaprahul94 profile image
Rahul Kashyap

Updated the answer :)

Thread Thread
 
macsikora profile image
Pragmatic Maciej • Edited

Now the interface of the function works in reverse way, what is correct is incorrect 😉

Thread Thread
 
kashyaprahul94 profile image
Rahul Kashyap • Edited

If i understood it correct, we are not allowed to change implementation of the method, just introduce types to make it work, right ?

Thread Thread
 
macsikora profile image
Pragmatic Maciej

Yes, implementation of the value level can stay, but assertion like as X is a type level. Currently implementation cannot compile because of lack of proper typing, there is a way to solve it without any assertion that is why I left it as it is, so with compile error.

You can modify the implementation, the key is to have it working as original + typed safe.