Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.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
Javascript 在Typescript中,类型和接口之间有什么区别?_Javascript_Typescript - Fatal编程技术网

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
}