"K扩展keyof T"与直接使用"keyof T"之间的区别?

lox*_*oxy 14 typescript

以下打字稿定义之间是否有任何区别:

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

function prop2<T>(obj: T, key: keyof T) {
    return obj[key];
}
Run Code Online (Sandbox Code Playgroud)

我的意思是不,但也许我已经监督了一些事情.使用第一个版本(通常在文档中使用)是否有任何好处

Tit*_*mir 20

不同之处在于,在第一种情况下,返回类型将是T[K]第二种情况下的返回类型T[keyof T].它可以是K最宽的keyof T但它可以是表示键的特定字符串文字类型.这意味着如果K是特定属性,则返回值将与属性的类型相同:

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
Run Code Online (Sandbox Code Playgroud)

  • 好,我懂了。谢谢! (2认同)