代码之家  ›  专栏  ›  技术社区  ›  Davide

Typescript声明变量类型重复

  •  1
  • Davide  · 技术社区  · 8 年前

    我声明了一个typescript变量,如下所示:

    let foo: any = this.someFunc(someArg);
    

    someFunc是一个返回类型与foo类型匹配的函数:

    public someFunc(arg: any): any {
        return {};
    }
    

    返回类型为“any”,但也可以是任何其他类型。

    考虑到可能在未指定类型的情况下表达了foo声明:

    let foo = this.someFunc(someArg);
    

    第一个声明示例应被视为错误还是错误?

    我目前在拉取请求中被告知,这是错误的,因为它构成了重复。

    在我看来,这两种用法都很好,第一种更具可读性,并强制执行分配给声明变量的返回类型。

    在typescript代码示例中,我看到了两种符号。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Ruan Mendes    8 年前

    这是你的团队必须做出的风格选择。

    是的,它是重复的,因为它可以被编译器推断出来;然而,编写这些函数更容易让开发人员知道,而不必单击许多函数(因为someFunc可能从其他函数推断其类型)。

    // The compiler knows that a is a number, developers will have to look 
    // inside someFunc and otherFunc to know that
    const a = someFunc();
    function someFunc() {
       return otherFunc();
    }
    function otherFunc(){
        return 1;
    }
    

    此外,如果您犯了错误,编译器会告诉您,因此类型信息的重复并没有复制实际代码那么糟糕。

    FWIW,我的团队已经决定键入所有内容,这样我们就不必一直打电话询问何时键入内容。唯一的例外是使用初始化字段/变量时 new ,并且不需要类型是某个超类/接口。

        2
  •  1
  •   Nitzan Tomer    8 年前

    编译器推断 foo 基于函数的返回类型,这就是为什么不需要显式指定它。

    指定它并没有错,也不是错误,只是更冗长。
    有些人喜欢这种冗长的方式,因为它更具可读性,有些人认为它是多余的。

    你需要弄清楚你团队中的惯例是什么,并以此为基础开展工作。

    在某些情况下,使用它更有意义,例如:

    interface A {
        x: number;
    }
    
    interface B extends A {
        y: number;
    }
    
    function fn(): B { return null }
    
    let a: A = fn();