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

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

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

相关·内容

【TypeScript 演化史 -- 7】映射类型和更好的字面量类型推断

这就是为什么试图将 42 赋值给 x 属性,TypeScript 会出错。在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(非严格模式)。...: T[P] }; /** * From T pick a set of properties K */ type Pick = { [P in K...可以使用 Pick 对该行为进行构建,正如其名称所示。 更好的字面量类型推断 字符串、数字和布尔字面量类型(如:"abc",1和true)之前仅在存在显式类型注释才被推断。...试图更改其他位置的值会导致编译错误。因此,推断只读类属性的字面量类型是合理的,因为它的值不会改变。...但是,为两个常量推断字面量类型“GET”和“POST”,一切就都解决了。

2.8K10

TS 从 0 到 1 - 泛型进阶

(2022)); // 2022 就像传递参数一样,传递需要用于特定函数调用的类型。...# 泛型使用时机 函数、接口或类将处理多种数据类型(为了通用) 函数、接口或类在多个地方使用该数据类型(为了一致) # 泛型约束 泛型约束用于限制每个类型变量接受的类型数量。...# 泛型参数默认类型 可以为泛型中的类型参数指定默认类型,使用泛型没有在代码中直接指定参数类型参数,从实际值参数中无法推断出类型,这个默认类型就会起作用。...如,never 类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头表达式的返回值类型。 没有类型是 never 的子类型或可以赋值给 never 类型(除了 never 本身)。...Pick的作用是将某个类型中的子属性挑出来,变成包含这个类型部分属性的子类型。

70120

【类型挑战】实现 Pick,难度⭐️

Dear,大家好,我是“前端小鑫同学”,长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ 知识运用: 在实现Pick这道题目的过程中运用到的知识点如下: Keyof 类型运算符; Mapped...Types 映射类型; Indexed Access Types:索引访问类型; 泛型中约束类型参数; 题目分析: 题目地址:4-easy-pick 如图所示我们需要设计一个通用类型工具...需要取出在Todo中不存在的属性invalid及类型抛出错误。...K extends keyof T> = { [key in K]: T[key] } 复制代码 通过keyof T来得到接口中所有属性的字符串组成的合集; 使用in来遍历联合类型K得到每次遍历的值...key,形式为[key in keyof T]; 使用索引访问类型,得到接口中特定属性的类型,形式为T[key]; 使用extends来约束K均来自于T中; 接下来的一题是:【类型挑战】实现 Readonly

27220

《现代Typescript高级教程》泛型和类型体操

通过显式传递泛型参数,我们可以确保在函数调用时指定了具体的类型。 2. 泛型接口 泛型接口允许我们在接口定义中使用类型参数,以便在实现该接口指定具体的类型。...涉及到泛型,还有一些重要的概念和内置泛型函数可以深入分析。让我们继续探讨 extends 关键字、TS 官方内置的一些泛型函数以及它们的使用。...Pick Pick 是 TypeScript 中的另一个内置泛型函数,它可以从给定类型 T 中选择指定的属性 K 组成一个新的类型。...function pickProperties(obj: T, keys: K[]): Pick { const result: Partial...涉及到官方内置的泛型函数,还有一些重要的函数值得分析。让我们继续探讨一些常用的官方内置泛型函数以及它们的使用。

26530

TypeScript 中的 extends 怎么那么骚啊?

2、条件判断 我们可以可以继续衍生,子类型与父类型符合正常的继承关系,判断结果为 true,否则为 false。 这里的继承关系,表达的是一种替换关系,或者说是约束力度的缩小。...string : number 这里表达的含义是, A 能够替换 B ,判断结果为 true,否则,判断结果为 false。...类型 type Pick = { [P in K]: T[P] } type B = Pick 当我们在 Pick...never : T type b = Exclude 我们来分析一下,首先刚才我们已经知道,传入的泛型为联合类型,会先分配再传入 因此,此时传入的联合类型 a 会被拆分传入。...理解了 Pick 和 Exclude,这个理解起来非常容易 type Omit = Pick> 使用 interface A { name

16910

58. 精读《Typescript2.0 - 2.9》

严格模式导致的大量边界检测代码,已经有解了 直接访问一个变量的属性,如果这个变量是 undefined,不但属性访问不到,js 还会抛出异常,这几乎是业务开发中最高频的报错了(往往是后端数据异常导致的..."string" T 的类型是 string ,TypeName 的表达式类型为 "string"。...此处灵感来自 egg-ts 总结 增加了 never object 类型 一个函数无法执行完,或者理解为中途中断,TS 2.0 认为它是 never 类型。...Pick。从对象类型 T 挑选一些属性 K,比如对象拥有 10 个 key,只需要将 K 设置为 "name" | "age" 就可以生成仅支持这两个 key 的新对象类型。...可以利用内置类型方便推导出来:type Omit = Pick> NonNullable。

1K20

Java 中文官方教程 2022 版(六)

因为li是Integer对象的列表,而不是int值的列表,您可能会想知道为什么 Java 编译器没有发出编译错误。编译器不会生成错误,因为它从i创建一个Integer对象并将该对象添加到li中。...原始值是以下情况,Java 编译器会应用自动装箱: 作为传递给期望相应包装类对象的方法的参数。 赋给相应包装类的变量。...包装类的对象是以下情况,Java 编译器会应用拆箱: 作为传递给期望相应原始类型值的方法的参数。 赋给相应原始类型的变量。...为了说明最后一点,在以下示例中,推断确定传递pick方法的第二个参数的类型为Serializable: static T pick(T a1, T a2) { return a2; } Serializable...foo方法调用List.set(int, E),编译器无法确认要插入列表的对象类型,从而产生错误出现这种类型的错误时,通常意味着编译器认为你正在将错误的类型赋给变量。

11600

读Zepto源码之IOS3模块

接下来,将数组转换成对象,用变量 t 来保存,后面会看到,遍历用的是 for...in 来处理。为什么不直接用 for 来处理数组呢?...用 k 来保存当前索引,accumulator 为返回值。 接下来,检测回调函数 fun 是否为 function ,如果不是,抛出类型错误。...在数组为空,并且又没有提供初始值(即只有一个参数 fun)抛出类型错误。...如果没有提供初始值,则迭代索引,直到找到在对象 t 中存在的索引。注意这里用了 do...while,所以最终结果,要么是报类型错误,要么 accumulator 能获取到值。...return accumulator 要注意,如果没有提供初始值k 是自增后的值,即不再需要处理数组的第一个值。

66800
领券