Pick<T,K>是一种 TypeScript 中的工具类型,用于从类型T中选择指定的属性K,并返回一个新的类型。它的定义如下:
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
在使用Pick<T,K>时,如果传递的类型T不包含属性K,它不会抛出错误,而是返回一个新的类型,该类型只包含T中存在的属性K。
这种行为是由TypeScript的设计决策所决定的。TypeScript的目标是提供静态类型检查和类型推断,以帮助开发人员在开发过程中发现潜在的错误。然而,TypeScript也允许一定程度的灵活性和宽容性,以便开发人员可以更自由地表达他们的意图。
在这种情况下,当传递的类型T不包含属性K时,TypeScript不会抛出错误,因为它认为这可能是开发人员有意为之。这种设计决策允许开发人员在使用Pick<T,K>时更加灵活,可以选择忽略某些属性而不会导致编译错误。
然而,如果你希望在Pick<T,K>中传递不存在的属性K时抛出错误,你可以使用索引类型查询 keyof T 来进行类型检查。例如:
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
function pickProperties<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {
const result = {} as Pick<T, K>;
for (const key of keys) {
if (key in obj) {
result[key] = obj[key];
} else {
throw new Error(`Property '${key}' does not exist in object.`);
}
}
return result;
}
// Example usage
const obj = { name: "John", age: 30, city: "New York" };
const picked = pickProperties(obj, ["name", "age", "gender"]); // Throws an error
在上面的示例中,我们定义了一个pickProperties函数,它接受一个对象obj和一个属性数组keys,并返回一个新的类型,该类型只包含obj中存在的属性。在函数内部,我们使用了类型检查来确保传递的属性存在于obj中,如果不存在,则抛出一个错误。
这样,当传递的属性数组中包含不存在的属性时,会抛出一个错误,从而提醒开发人员进行修正。
领取专属 10元无门槛券
手把手带您无忧上云