Javascript 在Typescript中,类型和接口之间有什么区别?
以下两者之间有什么区别Javascript 在Typescript中,类型和接口之间有什么区别?,javascript,typescript,Javascript,Typescript,以下两者之间有什么区别 type Foo = { foo: string }; interface Foo { foo: string; } 接口可以扩展 接口A{ x:数字; } 接口B扩展了A{ y:字符串; } 而且还增加了 接口C{ m:布尔型; } // ... 后来。。。 接口C{ n:编号; } 但是,类型别名可以表示接口无法表示的某些内容 type NumOrStr=number |字符串; NeatAndCool类型=整洁和凉爽; 键入JustSomeO
type Foo = {
foo: string
};
interface Foo {
foo: string;
}
接口可以扩展
接口A{
x:数字;
}
接口B扩展了A{
y:字符串;
}
而且还增加了
接口C{
m:布尔型;
}
// ... 后来。。。
接口C{
n:编号;
}
但是,类型别名可以表示接口无法表示的某些内容
type NumOrStr=number |字符串;
NeatAndCool类型=整洁和凉爽;
键入JustSomeOtherName=SomeType;
因此,一般来说,如果您只有一个普通的对象类型,如您的问题所示,接口通常是一个更好的方法。如果您发现自己想要编写一些不能作为接口编写的东西,或者只想给一些东西起一个不同的名称,那么类型别名更好。此外,还可以实现接口。类型有点像接口,反之亦然:两者都可以通过类实现。 但有一些重要的区别: 1.当类型由类实现时,属于该类型的属性必须在类内初始化,而使用接口必须声明它们。 2.正如@ryan提到的:接口可以扩展另一个接口。类型不能
type Person = {
name:string;
age:number;
}
// must initialize all props - unlike interface
class Manager implements Person {
name: string = 'John';
age: number = 55;
// can add props and methods
size:string = 'm';
}
const jane : Person = {
name :'Jane',
age:46,
// cannot add more proprs or methods
//size:'s'
}
这些之间的差异也已经存在于这个线程中
type Foo = {
foo: string
};
interface Foo {
foo: string;
}
这里的类型Foo
和接口Foo
看起来几乎相似,所以很容易混淆
接口
是指对象中应包含以下属性(此处为foo:string
)。
接口
不是类
。当语言不支持多重继承时使用。因此,接口
可以是不同类之间的通用结构
class Bar implements Foo {
foo: string;
}
let p: Foo = { foo: 'a string' };
但是类型
和接口
在非常不同的上下文中使用
let foo: Foo;
let today: Date = new Date();
这里foo
的type
是foo
,today
是Date
。
它就像一个变量的偏差,保存着其他变量的类型信息。
type
就像是接口、类、函数签名、其他类型甚至值的超集(比如type mood='Good'|'Bad'
)。
最后,类型描述了变量的可能结构或值。说“接口可以实现”是错误的,因为类型也可以实现
type A = { a: string };
class Test implements A {
a: string;
}
尽管您可以这样做,但您不能实现一个类型的并集,老实说,这是完全有意义的:)类型脚本中的类型用于引用已有的类型。它不能像
接口
那样扩展。类型的示例有:
type Money = number;
type FormElem = React.FormEvent<HTMLFormElement>;
type Person = [string, number, number];
另一方面,接口允许您创建新类型
interface Person{
name: string,
age: number,
}
Interface can be extended with extends keyword.
interface Todo{
text: string;
complete: boolean;
}
type Tags = [string, string, string]
interface TaggedTodo extends Todo{
tags: Tags
}
类型不能像接口扩展那样扩展。类型只是类型的别名。这里提供的指南是:我主要使用类型来表示外部数据,例如来自JSON文件的数据,或者如果您只编写函数而不使用OOP类。我发现这篇文章很有用,可以解释这些不同之处——公认的答案已经过时了。更新的解释贴在这里(因为这个帖子似乎受到谷歌的青睐):一个对象可以实现多个接口类东西实现整洁、酷
亲爱的Dave,你应该留下评论而不是答案。同样基于你的回答也不完全正确。类型别名可以代表一些接口无法
的东西。在我看来,你的示例NeatAndCool
和JustSomeOtherName
可以创建为扩展现有Neat
的接口,Cool
或SomeType
类型。事实上,第二个和第三个示例可以使用接口创建:接口NEA和Cool扩展整洁,Cool{}
接口JustSomeOtherName扩展SomeType{}
扩展两个接口并不总是产生与交叉点类型相同的结果,并不是所有类型都可以扩展(而所有类型都可以别名或放入并集/交集),那么类型的优点是什么?我们能说当我们有接口时,类型是无用的吗?
interface Person{
name: string,
age: number,
}
Interface can be extended with extends keyword.
interface Todo{
text: string;
complete: boolean;
}
type Tags = [string, string, string]
interface TaggedTodo extends Todo{
tags: Tags
}