Difference between of "K extends keyof T" vs. directly using "keyof T"?

0

Issue

Is there any difference between the following typescript definitions:

function prop<T, K extends keyof T>(obj: T, key: K) {
    return obj[key];
}

and

function prop2<T>(obj: T, key: keyof T) {
    return obj[key];
}

I mean no, but maybe I have overseen something. Are there any benefits to use the first version (which is often used in the docs)

Solution

The difference is that in the first case the return type will be T[K] while in the second case it will be T[keyof T]. K can at it’s widest be keyof T but it can be a specific string literal type representing a key. This means if K is a specific property the return value will be of the same type as the property:

function prop<T, K extends keyof T>(obj: T, key: K) {
    return obj[key];
}
function prop2<T>(obj: T, key: keyof T) {
    return obj[key];
}

let o = {
    p1: 0,
    p2: ''
}

let v = prop(o, 'p1') // is number, K is of type 'p1'
let v2 = prop2(o, 'p1') // is number | string, no extra info is captured

Answered By – Titian Cernicova-Dragomir

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave A Reply

Your email address will not be published.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More