ts 泛型函数
声明一个方法两个参数,第一个参数为对象,第二个参数是第一个参数中的某个key
可以使用 TypeScript 的泛型来定义一个方法,该方法接受一个对象和一个表示对象属性的键(key)。以下是一个示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 定义泛型方法
function getValueByKey<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
// 示例使用
interface ExampleObject {
name: string;
age: number;
address: string;
}
const myObject: ExampleObject = {
name: "John",
age: 25,
address: "123 Main St",
};
// 获取 "name" 属性的值
const nameValue: string = getValueByKey(myObject, "name");
console.log(nameValue); // 输出: John
// 获取 "age" 属性的值
const ageValue: number = getValueByKey(myObject, "age");
console.log(ageValue); // 输出: 25
在上面的例子中:
T
是泛型参数,表示传入的对象的类型。K
是另一个泛型参数,表示对象属性的键类型,它必须是传入对象T
的键之一,使用keyof T
来实现。getValueByKey
方法接受两个参数:obj
表示对象,key
表示对象属性的键。- 返回类型使用
T[K]
表示,这表示返回的值的类型是对象T
中键为K
的属性的类型。
这样,你可以通过传递不同类型的对象和相应的属性键来使用这个泛型方法。
type 与 interface 区别
声明方式不同:
type
可以声明基本类型、联合类型、交叉类型、它是一种灵活的声明方式interface
通常用于定义对象形状,包括属性,方法和索引签名。
合并方式不同
type
只能保持唯一,声明相同的名字会报错interface
声明多个同名时会自动合并。
拓展性
type
也支持拓展,通常是定义联合类型、交叉类型来实现。interface
支持声明合并拓展
总结: interface 更适合面向对象编程用于定义对象形状的类型 type 更加灵活,适合交叉类型、联合类型,对类型进行别名声明