Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 类型脚本接口和实现_Typescript - Fatal编程技术网

Typescript 类型脚本接口和实现

Typescript 类型脚本接口和实现,typescript,Typescript,我在玩打字脚本和界面。我有下面的代码 interface Control { name: string; onSelect():string; } class Button { name:string="button"; onSelect = function() { return "hello"; } } var a:Button = new Button(); var b:Control = {"name": "arbitrary"

我在玩打字脚本和界面。我有下面的代码

interface Control {
    name: string;
    onSelect():string;
}

class Button {
    name:string="button";
    onSelect = function() {
        return "hello";
    }
}

var a:Button = new Button();
var b:Control = {"name": "arbitrary", "onSelect": () => { return "ahoy!"; }};

var trigger = function(c:Button) {
    console.log(c.name, "says", c.onSelect());
}

trigger(a);
trigger(b);
它编译和运行时毫无怨言。谁能解释一下为什么我的
触发器
函数接受
b
,即使它希望得到一个类型
按钮
,并且
b
控件
类型

即使
按钮
要显式实现
控件
,我要求的是
按钮
而不是
控件
。对于所有预期用途,
按钮
可能包含其他成员

TypeScript推断实现仅仅是因为它们在结构上相同吗?是否允许您传递一个接口,其中需要实现类?(难道不是相反吗?

如中所述:

TypeScript的核心原则之一是类型检查关注值所具有的“形状”。这有时被称为“鸭子打字”

在:

如果它看起来像一只鸭子,游泳像一只鸭子,那么它很可能是一只鸭子

换句话说,TypeScript检查提供的对象或类型的形状(方法和属性)。如果提供的对象包含接口所描述的所有属性和方法,那么该对象很可能被视为与所描述的接口兼容的对象

在您的示例中,接口和类看起来完全相同,因此TypeScript将对象视为与所描述的接口兼容


如果您需要,请注意根本没有提到您的接口-这是因为TypeScript接口本质上是开发人员提供的类型元数据,可以帮助TypeScript验证类型兼容性。

您的
接口和
类都有相同的实现,因此,虽然它需要一个
按钮
,但您正在传入一个兼容的对象(具有返回字符串的名称和返回字符串的onSelect函数)

如果将另一个属性添加到
按钮
,例如
问候语:字符串
,它将在
触发器(b)
上出错,说明它无效

interface Control {
    name: string;
    onSelect:() => string; // this is another way to write function that returns a string
}

class Button implements Control {
    name:string="button";
    onSelect = function() {
        return "hello";
    }
    greeting: string; // adding this will cause trigger(b) to fail
}

有没有办法实施严格的类型检查?这使我更容易忽略可能带来问题的细微差别。@Andrei-Type安全性不是“JavaScript方式”™" 许多JS程序员喜欢这样一个事实,即他们可以快速而松散地处理类型。TS增加了一些类型安全性,但它仍然比C/C++/C#/Java/等更松散。@Andrie:而且,正如John提到的,如果你让你的对象或接口看起来不同,那么TS会警告你。谢谢你的输入!你知道有没有办法启用严格的类型检查吗?W“难道你认为这是不必要的吗?”R.Reimees,我不认为它是必要的。一旦你的班级有任何其他类型的属性,或者不完全匹配这个接口,它就不允许它。谢谢你的输入!如果<代码>按钮<代码>有一个私有成员,只有它(或者从它延伸的类)。将被认为是兼容类型。如果这是期望的行为,您可以考虑添加一个“哑”的私有成员。我想。我正在考虑添加一个哑成员。您认为严格的类型强制执行不必要的东西吗?它违背TS的原理吗?我会说它很少有生产力,但总是有例外。如果
触发器
实际上取决于
按钮
的各个方面,而不是它使用的成员。谢谢您的输入!