目录
结构类型系统(Structural Type System)
TS与JS的关系
- TypeScript是JavaScript的超集。
- TypeScript提供所有JavaScript特性,并在JavaScript的基础上增加了TypeScript类型系统
- TypeScript类型系统被设计为“可选”系统,这意味着所有的JavaScript代码都是合法的TypeScript代码。
TS的编译过程
在TS编译过程中,‘TS的类型检查’和‘生成JS代码’是两个独立的过程,所以类型检查出错并不影响JS代码生成。跟C++编译过程对比一下就知道啦
类型系统
结构类型系统(Structural Type System)
通过类型的实际结构来确定两个类型是否相等或兼容。
这种类型的语言有TypeScript、Haskell、OCaml、Go等。
class Foo {
public hi() {
console.log('hi');
}
}
class Bar {
public hi() {
console.log('hello');
}
}
const a: Foo = new Foo();
const b: Bar = a;
b.hi();
看,只要结构相同就能行,但是名义类型系统的语言就不行了。
名义类型系统(Nominal Type System)
通过类型的名称确定两个类型是否相等。
这中类型系统的语言有:C、C++、Java、C#、Rust等。
#include<iostream>
class Foo {
public:
void hi() { std::cout << "hi" << std::endl;}
};
class Bar {
public:
void hi() {
std::cout << "hello" << std::endl;
}
};
int main() {
Foo foo;
Foo &fooRef = foo;
//Error:type 'bar'cannot bind to a value of unrelated type 'Foo';
Bar &bar = foo;
return 0;
}
出错了:在名义系统中,一旦名字不同就会报错,所以这块要注意!
类型注解
TypeScript注解放在后面加一个冒号:
#TypeScript
function log(message: string): void
这里我们顺便提一下别的语言的类型注解方法,进行对比
C++注解 放在前面,啥也不加
//C++
int printf(const char*, ... );
Objc注解 放在前面,加括号
#Objective-c
- (id)initWithInt:(int)value;
Julia注解 放在后面,加两个冒号
//Julia
commission(sale::Int, rate::Float64)::Float64
有点困了,明天继续哈