typescript接口 - 没有参数的类实现

时间:2018-03-05 16:46:47

标签: typescript

在typescript中,我定义了一个实现该接口的接口和类。

interface II {
p1:string;
m1(p:number):string;
}

class A implements II {
    p1;             //??? why data type is not required?
    m1() {         // ??? why it is working even without parameter p
       return "return string"
   }
}

3 个答案:

答案 0 :(得分:0)

这是因为TypeScript中的接口是设计时构造。编译成JavaScript后它们不存在。

他们出现是为了指导编码人员实施,但在运行时他们不存在,所以程序运行顺利。

  

来源.TS

interface II {
    p1: string;
    m1(p: number): string;
}

class A implements II {
    p1;             //??? why data type is not required?
    m1() {         // ??? why it is working even without parameter p
        return "return string"
    }
}
  

获取转换为.JS

var A = /** @class */ (function () {
    function A() {
    }
    A.prototype.m1 = function () {
        return "return string";
    };
    return A;
}());
  

没有任何打字,但如果你自己包含参数,你会得到没有类型信息的参数名称:

var A = /** @class */ (function () {
    function A() {
    }
    A.prototype.m1 = function (p) {
        return "return string";
    };
    return A;
}());
  

判决

TypeScript,顾名思义,它只是在作者时提供强类型。

答案 1 :(得分:0)

Typescript uses a structural 而不是名义类型系统。这意味着如果使用声明调用实现是安全的,那么打字稿编译器就不会抱怨。

在这种情况下,额外的参数将为 ignored at runtime

答案 2 :(得分:-1)

这是允许的,因为在检查函数兼容性时,typescript将允许实现函数指定更少的参数。如果调用者指定了额外的参数,那么它们将被具有较少参数的函数忽略,并且不会产生任何伤害。这是Javscript中的常见场景,请考虑map函数,例如:

[1].map(v=> v+1); // a function with just one param is fine
[1].map((v, i)=> v + i); // but also one with two 

您可以在typescript here

中详细了解类型兼容性