xcatliu / typescript-tutorial

TypeScript 入门教程
https://ts.xcatliu.com
10.44k stars 1.33k forks source link

重载报错 #105

Open jianjiachenghub opened 4 years ago

jianjiachenghub commented 4 years ago

函数的类型/重载.ts(4,39): error TS2366: Function lacks ending return statement and return type does not include 'undefined'.

function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string  {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }
}
chaihongjun commented 4 years ago

@jianjiachenghub
对啊,后面提到:

注意,TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面。 我把最后的定义放到最前面也还是一样报错

ly525 commented 4 years ago

这样应该可以:

正在学习ts,如果不对,欢迎纠正

function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string | void   {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }
}
wenston commented 4 years ago

这样应该可以:

正在学习ts,如果不对,欢迎纠正

function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string | void   {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }
}

这样改写是可以。 但问题是:作者 @xcatliu 写这篇文章的时候应该是不报错的。那么现在报错的原因是由于ts版本变化或者说是编译器编译规则改动导致的吗?

jylzs369 commented 4 years ago

这样应该可以:

正在学习ts,如果不对,欢迎纠正

function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string | void   {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }
}

这样改写是可以。 但问题是:作者 @xcatliu 写这篇文章的时候应该是不报错的。那么现在报错的原因是由于ts版本变化或者说是编译器编译规则改动导致的吗?

应该不是版本和编译器的问题,至少我尝试了2.4.1之后的版本,都会提示错误。个人觉得是一开始就忽略了这个可能性,即函数的流程可能不会走到任何一个条件语句中去,所以这个函数是可能没有返回的,但显式设定的返回类型肯定是不能覆盖到这个可能性的。