我对打字稿很新,当我从操场上用界面部分学习它时,有一个混淆:
http://www.typescriptlang.org/Handbook#interfaces-our-first-interface-
http://www.typescriptlang.org/Handbook#interfaces-class-types
一个是谈论如何定义对象的接口,一个是为类定义,但是它们可以使用类似的结构,任何人都可以指出为什么?
答案 0 :(得分:1)
对象的接口,一个是为类定义的,但是它们可以使用类似的结构,任何人都可以指出为什么
truthTable :: [String] -> [[(String, Bool)]]
truthTable [] = [[]]
truthTable (x:xs) = (map ((x,True):) ts) ++ (map ((x,False):) ts) where ts = truthTable xs
没有运行时 creator 的知识。而类实例知道它的构造函数。如下所示:
object
这并没有改变打字稿是结构https://basarat.gitbooks.io/typescript/content/docs/getting-started.html
的事实类也可以为您的代码提供更好的结构:https://basarat.gitbooks.io/typescript/content/docs/classes.html
答案 1 :(得分:0)
在这两种情况下,接口都有相同的用途 - 应用类型限制/细化。 “对象的接口”和“用于(或应用于)类的接口”之间没有区别。
第一个例子显示Structural Typing而没有引入类的概念:
具有符合类型的结构的任何类型都符合接口契约 1 。
..请注意,我们没有明确说明我们传递给'printLabel'的[匿名创建的]对象实现了这个界面,就像我们在其他语言中所做的那样。在这里,它只是重要的形状。 如果我们传递给函数的对象[可以通过静态证明符合] [在接口]中列出的要求,那么它是允许的。
实现接口的类的实例隐式保证此合同。将接口添加到类允许在类声明本身而不是仅在使用地点进行额外的约束检查:这样可以实现更多本地化和有用的类型相关错误报告。
1 这是静态/编译限制:对象的类型信息已从对象文字本身自动合成。实际的运行时值与证明类型正确性无关。
答案 2 :(得分:0)
它们具有相似的结构,但它们以不同的方式使用。该类允许您创建要在应用程序中使用的新对象。接口告诉编译器应该如何构造事物。您可以在下面看到可以向label属性添加值。您无法通过界面执行此操作。
interface Something {
label: string;
}
class Something {
label: string = 'some string value';
}
在下面的示例中,接口强制Something
类始终需要名为label
的属性,并且类型必须为string
。如果您更改类型或一起删除属性。编译器会抱怨。
interface ISomething {
label: string;
}
class Something implements ISomething {
label: string = 'some string value';
}
在上面的示例中,我建议使用在接口名称前添加大写I
的约定,以消除类和接口之间的混淆。
在下一个示例中,我们将使用接口(IUser
)来允许将几个类传递到getUserDescription
函数,而无需编译器抱怨。这称为多态性。如果是教师,学生或任何其他班级,我们的职能并不在乎。它所关心的是传入的结构与接口匹配。
interface IUser {
firstName: string;
lastName: string;
type: string;
}
class Student {
firstName: string = null;
lastName: string = null;
type: string = 'student';
courses: Array<any> = [];
constructor(firstName: string, lastName: string) {
this.firstName = firstName;
this.lastName = lastName;
}
}
class Teacher implements IUser {
firstName: string = null;
lastName: string = null;
type: string = 'teacher';
classes: Array<any> = [];
constructor(firstName: string, lastName: string) {
this.firstName = firstName;
this.lastName = lastName;
}
}
const getUserDescription = (user: IUser): string => {
return `${user.firstName} ${user.lastName} is a ${user.type}`;
};
getUserDescription(new Teacher('Harry', 'Jones')); // Harry Jones is a teacher
getUserDescription(new Student('Joe', 'Cool')); // Joe Cool is a student
如果您注意到上述Teacher
实施IUser
,Student
则没有。通常你会以同样的方式完成两件事,但我想证明你可以在班级强制执行结构。
查看我的文章http://www.codebelt.com/typescript/typescript-classes-object-oriented-programming/了解详情。