首页
学习
活动
专区
工具
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中,如果不存在,则抛出一个错误。

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

相关搜索:Java当T扩展接口时,为什么T仍然调用默认方法JsonPatchDocument<T>在调用API时抛出400错误当T扩展A时,如何将classOf[T]传递给接受A的方法?当T包含`const`数据成员时,为什么会删除`std::optional<T>::operator=`?当传递BigInt时,isNaN()抛出错误有没有一种类型安全的方式来表示函数在传递T时返回T类型的对象,而在传递T时返回Partial<T>类型的对象?当使用debug_rep(&s)调用template <typename T> string debug_rep(T *p)时,为什么T不是string*当传递错误的属性类型时,Typescript不会抛出错误当绑定数组为空时,为什么FORALL没有抛出值错误?当为T2抛出bad_alloc异常时,为什么此代码中会发生内存泄漏当返回泛型类型*时,我得到错误:没有足够的信息来推断类型变量T为什么当Numpy没有进行点积计算时,Dask数组会抛出内存错误?当T在命名空间中时,std::find在std::vector<std::reference_wrapper<T>>上失败,并出现"no match for‘operator==’“错误当set_jsonb没有更新密钥时,如何抛出错误?当使用@CompileStatic和泛型类时,构造函数不能应用于“(T)”错误当UPDATE的FROM子句中没有给出连接谓词时,postgres为什么不抛出错误当期望的功能是使用变量时,为什么appium抛出错误错误:在循环中使用df.at函数时,'BlockManager‘对象没有属性'T’问题使用Function<T将整数传递到泛型方法时出现编译错误,?扩展Number>>当编译器没有提供uint8_t时,它有什么好的替代品?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的合辑

领券