【Typescript】ts中泛型的使用方法和泛型约束
// 定义一个泛型函数,用于创建一个对象,对象的键是T类型的值,值类型是U类型的值
function createMap<T, U>(key: T, value: U): { [K in T]: U } {
const map: { [key: string]: U } = {};
map[key.toString()] = value;
return map as { [K in T]: U };
}
// 使用泛型函数
const stringToNumberMap = createMap<string, number>('key', 42);
const numberToStringMap = createMap('key', 'value');
// 打印结果
console.log(stringToNumberMap); // 输出: { key: 42 }
console.log(numberToStringMap); // 输出: { key: 'value' }
// 泛型约束,确保传入的泛型参数具有length属性
function getLength<T>(arg: T): number {
if (typeof arg === 'string') {
return arg.length;
}
// 使用自定义约束接口
if (arg.length) {
return arg.length;
} else {
throw new Error('Argument must have a .length property');
}
}
interface HasLength {
length: number;
}
// 使用泛型约束
const lengthOfString = getLength<string>('hello'); // 正确
const lengthOfArray = getLength([1, 2, 3]); // 正确
const lengthOfNumber = getLength(42); // 报错
// 打印结果
console.log(lengthOfString); // 输出: 5
console.log(lengthOfArray); // 输出: 3
// console.log(lengthOfNumber); // 报错: Argument must have a .length property
这段代码展示了如何在TypeScript中定义和使用泛型函数和泛型约束。createMap
函数接受两个类型参数T和U,并创建一个键为T类型,值为U类型的对象。getLength
函数接受一个泛型参数T,并检查T是否具有length
属性。如果不具有,则抛出错误。这两个示例都展示了如何在实际应用中使用泛型来增强代码的灵活性和重用性。
评论已关闭