typescript - “K extends keyof T” ile doğrudan “keyof T” kullanmanın farkı nedir?


Aşağıdaki TypeScript tanımları arasında herhangi bir fark var mı:

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

ve

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

Yani hayır, ama belki bir şeyi gözden kaçırmış olabilirim. Dokümanlarda sıklıkla kullanılan ilk sürümü kullanmanın herhangi bir faydası var mı?

Cevap #1

Fark şudur ki, ilk durumda dönüş türü T[K] olacakken, ikinci durumda T[keyof T] olacaktır. K, en geniş anlamıyla keyof T olabilir, ancak bir anahtarı temsil eden belirli bir string literal türü de olabilir. Bu, eğer K belirli bir özellikse, dönüş değerinin de özelliğin türüyle aynı olacağı anlamına gelir:

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

İlgili makaleler