typescript-tutorial icon indicating copy to clipboard operation
typescript-tutorial copied to clipboard

重载报错

Open jianjiachenghub opened this issue 5 years ago • 4 comments

函数的类型/重载.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('');
    }
}

jianjiachenghub avatar Dec 11 '19 09:12 jianjiachenghub

@jianjiachenghub
对啊,后面提到:

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

chaihongjun avatar Dec 11 '19 09:12 chaihongjun

这样应该可以:

正在学习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('');
    }
}

ly525 avatar Jan 21 '20 08:01 ly525

这样应该可以:

正在学习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版本变化或者说是编译器编译规则改动导致的吗?

wenston avatar May 21 '20 08:05 wenston

这样应该可以:

正在学习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之后的版本,都会提示错误。个人觉得是一开始就忽略了这个可能性,即函数的流程可能不会走到任何一个条件语句中去,所以这个函数是可能没有返回的,但显式设定的返回类型肯定是不能覆盖到这个可能性的。

jylzs369 avatar May 22 '20 08:05 jylzs369