如何修改TypeScript函数,消除非空参数调用时的非空断言符!
解决方案
要让函数根据输入类型自动推导正确的返回类型(传入非null的TreeNode时返回number,传入null时返回null),可以通过以下两种方式实现:
方法一:函数重载
通过定义多个函数重载签名,明确不同输入对应的返回类型,TypeScript会根据传入的参数类型匹配对应的重载,自动推导正确的返回类型:
type TreeNode = { value: number; left: TreeNode | null; right: TreeNode | null; }; // 重载签名:明确非null输入的返回类型 function minNode(node: TreeNode): number; // 重载签名:明确null输入的返回类型 function minNode(node: null): null; // 函数实现签名(内部逻辑不变) function minNode(node: TreeNode | null): number | null { if (node === null) { return null; } return node.value; } const node: TreeNode = { value: 1, left: null, right: null, }; const a = minNode(node); // 类型自动推导为number,无需非空断言! const b = minNode(null); // 类型自动推导为null
方法二:泛型条件类型
利用TypeScript的泛型和条件类型,让返回类型与输入类型动态关联,实现更灵活的类型推导:
type TreeNode = { value: number; left: TreeNode | null; right: TreeNode | null; }; function minNode<T extends TreeNode | null>(node: T): T extends TreeNode ? number : null { if (node === null) { return null as T extends TreeNode ? number : null; } return node.value as T extends TreeNode ? number : null; } const node: TreeNode = { value: 1, left: null, right: null, }; const a = minNode(node); // 类型自动推导为number,无需非空断言! const b = minNode(null); // 类型自动推导为null
两种方法都能解决问题,函数重载更直观易懂,适合简单的分支场景;泛型条件类型则更灵活,适合需要复杂类型关联的场景。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

