请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

函数重载的写法遇到问题

请教老师和同学们:

location: 课程2-12《复杂函数类型补充学习》中的重载写法
question: 只是简单将64行return (str+strx).length修改为65行return 0, TS检查器就飙红了。

图片描述图片描述
不是很清楚哪里写的不对,请教大家!

正在回答 回答被采纳积分+3

2回答

飞翔的旋律 2023-01-27 14:13:48

是的 重载函数的返回值应该保持一致, 代码改为如下即可:

//申明函数重载
function getString(str: unknown): number;
function getString(str: unknown, str2: string): number;

//实现函数
function getString(str1: unknown, str2?: string) {
    if(typeof str1 === 'string') {
        return 0;
    }

    return 1;
}

console.log(`getString value = ${JSON.stringify(getString(1))}`);

这个和Java 的重载感觉差不多

刚才看了视频中重载函数的使用例子,感觉是不是如果自己写Demo可能还行,如果在项目中一般不会在一个方法中有调用返回string 有调用返回number 的两个不同函数定义, 这样一般会是的代码逻辑不够清晰, 要不然实现两个不同的函数内容, 个人意见供参考:

//函数重载
function getStringValue(str: string): string;
function getStringValue(str1: string, str2: string): number;

function getStringValue(str1: string, str2?: string) {
    if (typeof str1 === 'string' && str2) {
       return (str1 + str2).length; //TS调用第二函数定义   
    }

    return str1; //TS 调用第一个函数定义
}

console.log(`The value is called - ${getStringValue('123', 'werwer')}`);



0 回复 有任何疑惑可以回复我~
飞翔的旋律 2023-01-27 11:20:31

你仔细看下你的函数定义, 一个是返回参数是string,一个是number, 而你调用的函数时返回string 但是你的if 条件句判断return 0 是number, 你转成string 因该就没问题了,

你的这段代码我有两个疑问:

  1. getstring 为什么重载地二函数返回是number?

  2. 真正逻辑的函数为什么为什么没有返回值?

其实对于多个参数代码也可以这么写,, 供参考:

//返回仅为字符串的数据类型,函数可以写成泛型话, 此处体会<初学者和最强辅助OpenAI(chatGPT> 
//给出的两个版本,自己也在学习中 
//优化前(自己最初的写法)
// const getStringResult = <T>(...args : unknown[]): T[] => {
//     const filterString: T[] = [];
//     args.filter(arg => {
//         if (typeof arg === 'string') {
//             filterString.push(arg as T);
//         } 
//     });

//     return filterString;
// }

//优化后(Open AI -> ChatGPT 给出的优化方案如下)
const getStringResult = <T>(...args : unknown[]): T[] => {
    return args.filter((arg :unknown) => typeof arg === 'string') as T[];
}


const inputValue_1 : unknown = 'aa4';
const inputValue_2 : unknown = undefined;
const inputValue_3 : unknown = true;
const inputValue_4 : unknown = 2;

console.log(`getStringResult value = ${JSON.stringify(getStringResult<string>(inputValue_1, inputValue_2, inputValue_3, inputValue_4))}`);
0 回复 有任何疑惑可以回复我~
  • 提问者 renderman #1
    首先,感谢慕圣9599806你的回复。
    上面已标明是课程代码,所以需求层面的东西就不多说了
    问题的核心是:在实现签名中,TS应当可以推断出是哪一个重载签名了,此处不应该报错有些不理解。
    我目前的解决办法是:给实现签名指定联合类型的返回值
    回复 有任何疑惑可以回复我~ 2023-01-27 12:05:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信