当前位置: 首页 > news >正文

面试题-函数入参为interface类型进行约束

在 TypeScript 里,对函数入参为interface类型进行约束的方式有很多种。下面结合不同场景,为你详细介绍具体的实现方法:

1. 基础接口约束

你可以直接把接口当作函数参数的类型,这样就能强制要求传入的参数必须和接口结构相符。

// 定义接口
interface User {name: string;age: number;email?: string; // 可选属性
}// 函数参数被约束为User接口类型
function printUserInfo(user: User) {console.log(`姓名: ${user.name}, 年龄: ${user.age}`);if (user.email) console.log(`邮箱: ${user.email}`);
}// 使用示例
const validUser = { name: "张三", age: 30 };
printUserInfo(validUser); // 正确const invalidUser = { name: "李四" }; // 缺少age属性
// printUserInfo(invalidUser); // 错误:类型不匹配

2. 可选属性与只读属性约束

你可以在接口里定义可选属性(使用?)或者只读属性(使用readonly)。

interface Config {readonly apiKey: string; // 只读属性,不可修改timeout?: number;        // 可选属性log?: (message: string) => void; // 可选的函数属性
}function initConfig(config: Config) {// config.apiKey = "newKey"; // 错误:无法修改只读属性console.log(`API Key: ${config.apiKey}`);config.log?.("初始化完成");
}

3. 索引签名约束

当你需要处理动态属性时,可以使用索引签名。

interface StringMap {[key: string]: string; // 所有属性名必须为string,属性值也必须为string
}function printMap(map: StringMap) {for (const key in map) {console.log(`${key}: ${map[key]}`);}
}const validMap = { name: "张三", city: "北京" };
printMap(validMap); // 正确const invalidMap = { name: "李四", age: 30 }; // age属性值为number,不符合约束
// printMap(invalidMap); // 错误

4. 泛型约束

借助泛型,你能够让约束更加灵活。

// 约束T必须包含id属性
function printId<T extends { id: number }>(obj: T) {console.log(`ID: ${obj.id}`);
}const user = { id: 1, name: "张三" };
printId(user); // 正确const invalidObj = { name: "李四" }; // 缺少id属性
// printId(invalidObj); // 错误

5. 交叉类型约束

你可以使用交叉类型(&)来组合多个接口的约束条件。

interface Loggable {log: () => void;
}interface Serializable {toJSON: () => object;
}// 函数参数必须同时满足Loggable和Serializable接口
function processEntity(entity: Loggable & Serializable) {entity.log();console.log(entity.toJSON());
}

6. 接口继承约束

通过接口继承,你可以扩展已有的接口约束。

interface Animal {name: string;
}interface Mammal extends Animal {giveBirth: () => void;
}// 参数必须满足Mammal接口(同时包含name和giveBirth)
function describeMammal(mammal: Mammal) {console.log(`${mammal.name} 是哺乳动物`);mammal.giveBirth();
}

7. 函数类型约束

如果你要约束函数参数本身,可以定义函数接口。

interface Validator {(value: string): boolean; // 函数类型定义
}function validateInput(input: string, validator: Validator) {if (validator(input)) {console.log("输入有效");} else {console.log("输入无效");}
}// 使用示例
const isEmail: Validator = (value) => value.includes("@");
validateInput("test@example.com", isEmail); // 正确

总结

  • 直接使用接口类型来约束函数参数的结构。
  • 运用可选属性(?)和只读属性(readonly)来进行更细致的约束。
  • 利用泛型约束(T extends ...)让约束条件更加灵活。
  • 通过交叉类型(&)和接口继承(extends)组合多个约束条件。
  • 定义函数接口对函数参数进行约束。

TypeScript 的类型系统功能强大,它能在编译阶段就发现类型不匹配的错误,大大提高了代码的可靠性。你可以根据实际的需求,选择合适的约束方式。

http://www.lryc.cn/news/573104.html

相关文章:

  • Python元组及字符串
  • 经典:在浏览器地址栏输入信息到最终看到网页的全过程,涉及网络协议以及前后端技术
  • SQL Server基础语句2:表连接与集合操作、子查询与CET、高级查询
  • 服务发现与动态负载均衡的结合
  • 零基础学习Redis(12) -- Java连接redis服务器
  • c++26新功能—hive容器
  • gRPC 框架面试题精选及参考答案
  • SVN上传代码
  • 力扣1546. 和为目标值且不重叠的非空子数组的最大数目
  • 【09】设计并实现一套面向 Agent 任务规划的 DSL 语言
  • 针对机器人自修复材料的具体推荐及特性分析
  • vscode搭建spring boot项目
  • Qt、C++自定义按钮、组件、事件编程开发练习,万字实战解析!!
  • TMultiplexedProtocol 和 TMultiplexedProcessor
  • 使用Vue3开发Electorn桌面应用
  • Maven-添加子模块
  • Vue2 day02
  • 记录一次:Java Web 项目 CSS 样式/图片丢失问题:一次深度排查与根源分析
  • 【STM32】STM32的中断系统寄存器NVIC、EXTI
  • Leetcode 440. 字典序的第K小数字
  • C++ CAN总线数据处理框架解析
  • 力扣1477. 找两个和为目标值且不重叠的子数组
  • YOLO官方自带的数据集Dotav1,直接训练
  • Python爬虫实战:研究threading相关技术
  • 状态模式详解
  • Filecoin系列 - IPLD 技术分析
  • verilog HDLBits刷题“Module shift8”--模块 shift8---模块和向量
  • Python 的内置函数 hasattr
  • 中国设计 全球审美 | 安贝斯新产品发布会:以东方美学开辟控制台仿生智造新纪元
  • 【Koa系列】10min快速入门Koa