把一些类型错误,就直接扼杀在编译过程当中,不用运行就已经知道有错
tsc ./xxx.ts ==> node ./xxx.js 运行TS文件
类:实例的属性,必须加上类型
- 在构造器当中的入参,配置实例属性访问修饰符 public/private/protected
- 继承语法:除了类型注解(type annotation)外与JS一模一样
-public作用:;
- 默认访问权限为public,name:string
- 定义name为实例属性(实例属性可以不用单独声明)
- 规定name在Animal内外作用域均可访问,pravite则只能在Animal作用域内访问
- 默认的xxx属性与当前实例绑定,可以不用写this.xxx = xxx
- pravite也可以默认的xxx属性与当前实例绑定,可以不用写this.xxx = xxx,只不过pravite则只能在Animal作用域内访问
- protected:实例属性只能在Animal作用域及其子类的作用域访问实例属性xxx
- 凡是拿不准实例属性的访问权限的情况下,就直接public完事
class Animal {
constructor(public name: string) {
}
move(distanceInMeters: number = 0) {
console.log(this.name);
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Snake extends Animal {
constructor(name: string) {
super(name);
}
move(distanceInMeters = 5) {
console.log("Slithering...");
console.log(this.name);
super.move(distanceInMeters);
}
}
let sam = new Snake("Sammy the Python");
console.log(sam.name);
sam.move();
泛型
class Greeter<T> {
greeting: T;
constructor(message: T) {
this.greeting = message;
}
greet() {
return this.greeting;
}
}
let greeter = new Greeter<string>("Hello, world");
let button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function() {
alert(greeter.greet());
}
document.body.appendChild(button);
let names:string[] = []
let names:Array<string> = []
联合类型及类型守卫
type NameOrNameArray = string | string[];
function createName(name: NameOrNameArray) {
if (typeof name === "string") {
return name;
}
else {
return name.join(" ");
}
}
var greetingMessage = `Greetings, ${ createName(["Sam", "Smith"]) }`;
alert(greetingMessage);
let frends:string | string[]
type NameOrArray = string | string[]
let args:NameOrArray = []
接口interface
接口是对具有特定key-value对象的声明
interface Light {
strength: number;
color: string;
name?:string
}
let light:Light
light = {}
light = {
strength:100,
color:"#fff",
position:["50px","80px"]
}
- 数组里面嵌套对象时,需单独给对象造一个接口
- xxx?:string 代表可选属性,可给可不给
interface Actor {
name: string;
role: string;
avatarAddress: string;
}
interface Film {
filmId: number;
name: string;
poster: string;
actors: Array<Actor>;
photos?: string[];
}
function deformatFilm(film: Film) {
console.log("deformatFilm", film);
}
deformatFilm({
filmId: 1234,
name: "万里归途",
poster: "https",
actors: [
{
name: "饶晓志",
role: "导演",
avatarAddress: "https://pic.maizuo.com/usr/movie/3c1b606e514b6cd66d376b56275dcc76.jpg",
},
{
name: "张译",
role: "演员",
avatarAddress: "https://pic.maizuo.com/usr/movie/ff9aafa8c6033a1277d5ecd65822f8ae.jpg",
},
],
});
函数
- 有入参,有返回值,不满足条件(入参+返回值要求)报错
- 有入参,无返回值,我们有具体返回值会给void重新赋值,不会报错
- 有入参,入参类型错,报错
- 有入参,可设置可选Fn(food?:number)=>void
- 有入参,我不接收,不会报错;一旦接收,就必须按照顺序+类型正确即可
- 还可以给函数声明一个类型别名
类
- 类是有具体声明,类是new出来的,我们想要类得到的实例,实现
implements某个接口规范,我们可以使用类来实现接口,
- 接口是没有实际功能的,class是具有实际功能的
- 接口是new不了,class是可以new的
- class还可以新增内容,但必须包含接口所有内容(?)
命名空间namespace
- 一个命名空间,实现域名隔离,防止不同模块下的(变量,函数,接口,类...)与其他模块形成命名冲突
- 命名冲突里面可以放任意内容
接口
- 接口当中使用可索引属性
- 例如人:人有很多属性,我们预留属性给使用者拓展
[key:string]:any
- 任意多个【字符串:any】类型的key-value
- 作用:随意拓展任意多个属性
接口继承
interface IStudent extends IPerson
IStudent接口 继承 IPerson 接口的属性
类可以单继承(一个类),多实现(多个接口)
class Student extentds Person implements IWork,IFigher{}
枚举
enum
- 不赋值,枚举就是对应的索引号;有赋值,枚举就是对应的值
- 不要将枚举的类型声明文件到dts文件当中,编译后会报 cant find module
TS和JS当中Void
- ts:void代表无返回值
- is:void代表返回undefined
never:永不返回
- 除了never,都可以给any赋值
- 无返回值,死循环,抛出错误
类型断言
function fn():number | string{
return Math.random()>0 ? "string" : 123
}
(<string>fn()).length
(fn() as string).length
编译选项
- noImplicitAny:true
- strictNullChecks:true
- strictPropertyInitialization:true
- noImplicitThis:true
- noImplicitRetures:true
- strict:true
声明类型并导出外界使用
- export declare 表示导出类型
- import type 表示导入类型
export declare enum Major {
HTML="HTML5",
CSS="CSS"
}
export declare interface ICodingStudent {
name:string,
major:Major
}
import type {ICodingStudent} from "./env"
import {Major} from "./env"