首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当传递T时,为什么Pick<T,K>没有抛出错误?

Pick<T,K>是一种 TypeScript 中的工具类型,用于从类型T中选择指定的属性K,并返回一个新的类型。它的定义如下:

代码语言:txt
复制
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 来进行类型检查。例如:

代码语言:txt
复制
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中,如果不存在,则抛出一个错误。

这样,当传递的属性数组中包含不存在的属性时,会抛出一个错误,从而提醒开发人员进行修正。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的沙龙

领券