何时在Typescript中使用类型约束?

问题描述 投票:0回答:2

根据打字稿文档: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

typescript generics types constraints
2个回答
1
投票
使用类型约束(第一种方法),打字稿将能够推断“非扩展”键类型。因此,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

0
投票
使用第一种方法,您可以做

getProperty<typeof x, 'a'>(x, 'a') // Ok getProperty<typeof x, 'a'>(x, 'b') // Error

您可以指定要使用的T的确切键。

使用secons方法,您只能使用T的任何键。

© www.soinside.com 2019 - 2024. All rights reserved.