programing

"K extends key of T"와 "key of T"를 직접 사용하는 것의 차이점은 무엇입니까?

powerit 2023. 7. 17. 21:27
반응형

"K extends key of T"와 "key of T"를 직접 사용하는 것의 차이점은 무엇입니까?

다음 유형 스크립트 정의 간에 차이가 있습니까?

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];
}

아니요, 하지만 제가 감독한 게 있을지도 몰라요.첫 번째 버전(문서에서 자주 사용됨)을 사용할 수 있는 이점이 있습니까?

차이점은 첫 번째 경우 반환 유형이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

이 두 식 사이에는 큰 차이가 있으며, 이로 인해 컴파일러가 다르게 동작합니다.


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

도움말은 일반 매개 변수를 사용하지 않도록 제한합니다.any입력 매개 변수가 다음을 지원하는지도 확인합니다.T


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

이것은 게터에 대한 컴파일러 오류를 발생시키지 않지만 세터의 경우에는 발생합니다.Type 'any' is not assignable to type 'never'.ts(2322)

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

이유는keyofobj[key]를 갖게 할 것입니다.never유형(키가 겹치지 않음), 자세한 내용은 https://stackoverflow.com/a/61758818/9814737 을 참조하십시오.

언급URL : https://stackoverflow.com/questions/53099089/difference-between-of-k-extends-keyof-t-vs-directly-using-keyof-t

반응형