在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"
}
}
答案 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
中详细了解类型兼容性