‘’K extends keyof T‘’是一种用于泛型约束的语法。它的意思是K必须是类型T的键(属性名称)之一。这个约束确保了在使用泛型函数或类型时,K的值只能是T类型的属性名称,从而提高类型安全性。 //泛型函数,K 必须是 T 的键之一functiongetProperty<T, K extends keyof T>(obj: T, key: K): T[K] {return...
有了keyof,咱们现在可以改进prop函数的类型注解。我们不再希望接受任意字符串作为key参数。相反,咱们要求参数key实际存在于传入的对象的类型上 代码语言:javascript 代码运行次数:0 运行 AI代码解释 functionprop<T,KextendskeyofT>(obj:T,key:K){returnobj[key]} TypeScript 现在以推断prop函数的返回类型为T[K],...
在不使用 keyof 运算符时,我们也可以手动定义联合类型: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 type keyProp='name'|'empCode';functiongetProperty<T,KextendskeyProp>(obj:T,key:K):T[K]{returnobj[key];} 尽管这种手动方式应用了相同类型的约束,但这种方法的可维护性较差。类型定义会重复,如...
让传入值满足特定条件; interfaceIWithLength { length:number } function echoWithLength<T extends IWithLength>(arg:T):T{ console.log(arg.length)returnarg } echoWithLength('str') 通过extends 约束了 K 必须是 T 的 key。 function getProperty<T, K extends keyof T>(obj: T, key: K): T[K]...
type Pick<T, K extends keyof T> = { [P in K]: T[P] }; 用例 interface Person { name: string; age: number; interest: string; } type T = Pick<Person, 'name' | 'age'> T => { name: string; age: number;}Exclude Exclude<T, U>的作用是将某个类型中属于另一个的类型移除掉。
使用KeyOf 运算符应用约束 在Type 中,keyof 运算符常用于在泛型函数中应用约束。让我们通过一个例子来详细了解这种用法: function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; } 上面的函数使用了泛型来定义一个对象属性的类型。keyof T 返回的是字符串字面量类型的联...
type MyPick<T, Keys extends keyof T> = { [key in Keys]: T[key] } // 使用 interface Todo { title: string; description: string; completed: boolean; } type TodoPreview = MyPick<Todo, "title" | "completed">; const todo: TodoPreview = { title: "Clean room", completed: false...
typescript高阶之映射类型与keyof 前言 一、映射类型语法及示例 1、映射类型语法 2、映射类型示例 二、实现工具类型 MyPartial 三、Key mapping语法及示例 1、Key mapping语法 2、Key mapping示例 Getter RemoveKindField 四、keyof用法 1、keyof应用示例
type Pick<T, K extends keyof T> = { [P in K]: T[P] } type B = Pick<A, 'name' | 'age'> 1. 2. 3. 4. 5. 当我们在 Pick 中传入 A 时, keyof A 的结果为 name | age | gender | class,因此 'name' | 'age' 是 keyof A 的子类型。
function useKey<T, K extends Extract<keyof T, string>>(o: T, k: K) { var name: string = k; // OK} 而如果你要处理所有的属性名,你可以这样写:function useKey<T, K extends keyof T>(o: T, k: K) { var name: string | number | symbol = k;} 类和接口 对类使用 keyof :...