根据打字稿文档:Using Type Parameters in Generic Constraints,使用通用约束的代码如下:
function getProperty<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
let x = { a: 1, b: 2, c: 3, d: 4 };
getProperty(x, "a"); // okay
getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.
但是,如果我尝试:
function getProperty<T>(obj: T, key: keyof T) {
return obj[key];
}
let x = { a: 1, b: 2, c: 3, d: 4 };
getProperty(x, "a"); // okay
getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.
它工作正常,我在这里看不到任何使用类型约束的原因。
所以我什么时候应该使用类型约束?特别是此处的关键字extends
。
key
的类型将为"a"
,而不是"a" | "b" | "c" | "d"
。 如果是否需要此行为,取决于特定的情况,但是您的示例似乎可以从中受益—该函数将能够正确解析属性类型:
function getProperty<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
function getProperty2<T>(obj: T, key: keyof T) {
return obj[key];
}
const x = { a: 1, b: '2', c: true };
const v = getProperty(x, "a"); // v is number
const v2 = getProperty2(x, "a"); // v2 is string | number | boolean
Playground
getProperty<typeof x, 'a'>(x, 'a') // Ok
getProperty<typeof x, 'a'>(x, 'b') // Error
您可以指定要使用的T的确切键。使用secons方法,您只能使用T的任何键。