this当前类
实例化对象 let p = new person("" , )
为什么在实例化的时候赋值
因为上面使用了构造函数,
export default {}
class Person {
// 字段
name: string
age: number
// 构造函数
constructor(name: string, age: number) {
this.name = name
this.age = age
}
// 函数
setHello(): void {
console.log(`我叫${this.name}我今年${this.age}`);
}
}
let q = new Person("张三", 23)
console.log(q);
export default {}
class Person {
// 字段
name: string
age: number
// 构造函数
constructor(name: string, age: number) {
this.name = name
this.age = age
}
// 函数
setHello(): void {
console.log(`我叫${this.name}我今年${this.age}`);
}
}
// let q = new Person("张三", 23)
// console.log(q);
// q.setHello()
class Zilei extends Person {
// 字段
score: string
// 构造函数
constructor(name: string, age: number, score: string) {
super(name, age)
this.score = score
}
// 函数
set(): void {
// 父级的函数
// super.setHello()
// 重写父类的方法
console.log(`我叫${this.name}我今年${this.age},我考了${this.score}`);
}
}
let w = new Zilei("张四", 23, "甲")
w.set()
static 与 instanceof
export default {}
class Fn {
static salary: string = "张三"
static say(): void {
console.log(`我叫${this.salary}`);
}
}
Fn.say()
class Person { }
let p = new Person()
let b = p instanceof Person;
console.log("p是Person实例化出来的吗?", b);
class Student extends Person { }
let s = new Student();
let d = s instanceof Person;
console.log("s是Person实例化出来的吗?", d);
export default {}
class Person {
// 字段
public name: string
protected age: number
private sex: string
// 构造函数
constructor(name: string, age: number, sex: string) {
this.name = name
this.age = age
this.sex = sex
}
// 函数
setHello(): void {
console.log(`我叫${this.name}我性别${this.sex}今年${this.age}`);
}
}
let q = new Person("张三", 23, "男")
q.setHello()
class Zilei extends Person {
// 字段
score: string
// 构造函数
constructor(name: string, age: number, sex: string, score: string) {
super(name, age, sex)
this.score = score
}
// 函数
set(): void {
console.log(this.name);
console.log(this.age);
// console.log(this.sex); //因为上面是私有属性 不能使用继承所以报错
console.log(this.score);
}
}
let w = new Zilei("张四", 23, "男", "甲")
w.set()
readonly用于标记一个属性是只读的,也就是不可修改的。
export default {}
class Print {
// readonly 只读属性必须在声明时
readonly str1: string = "我是声明 时赋的值"
readonly str2: string
readonly str3: string
readonly str4: string
readonly str5: string
readonly str6: string
constructor(str2: string, str3: string, str4: string, str5: string, str6: string) {
this.str2 = str2
this.str3 = str3
this.str4 = str4
this.str5 = str5
this.str6 = str6
}
}
let str = new Print("嗡嗡嗡", "哇哇哇", "呜呜呜", "喂喂喂", "我我我")
console.log(str);
get 读取字段 set 对字段进行修改
export default {}
class Name {
// 私有的字段
private myName: string = "张三"
// 读取字段的值 取值
get fullName() {
console.log("get");
return this.myName;
}
// 为字段赋值 (修改)
set fullName(newName: string) {
// console.log("set");
this.myName = newName
}
}
let n = new Name()
n.fullName = "赵四" //修改赋值
console.log(n); //修改
// console.log(n.fullName); //取值
抽象类(抽象 成员)
抽象类作为其他派生类的基类的使用,他们一般不会直接被实例化
抽象类专门用于定义那些不希望被外界 直接创建的类的
抽象类和接口一样用于约束子类
抽象类和接口类的区别:
抽象方法必须包含,abstract关键字并且可以包含访问修饰符
接口中只能定义约束不能定义具体实现,而抽象类中既可以定义约束,又可以定义具体实现
export default {}
// 父类
abstract class Fn {
abstract name: string
abstract age: number
abstract show(): string
// void 没有返回值
strNname(): void {
console.log("我叫张三");
}
}
// 子类
class Str extends Fn {
name: string = "张三"
age: number = 34
show() {
return "我是赵四"
}
}
let s = new Str()
let q = s.show()
console.log(q);
类继承多个接口
export default {}
// 接口
interface Fu {
name: string
age: number
sex: string
show(): void
}
// 接口
interface Xiong {
each: string
}
// 类
// 类继承一个接口 implements
class Zi implements Fu, Xiong {
name: string = "张三";
age: number = 32;
sex: string = "男";
each: string = "吃饭";
show() {
console.log(`我叫${this.name}今年${this.age}`);
}
}
let n = new Zi()
n.show()
继承一个类 同时可以继承一个接口
接中不能在里面提供实现赋值的
export default {}
// 接口
interface Fu {
name: string
age: number
sex: string
show(): void
}
// 接口
interface Xiong {
each: string
}
// 类
// 类继承一个接口 implements
class Zi implements Fu, Xiong {
name: string = "张三";
age: number = 32;
sex: string = "男";
each: string = "吃饭";
show() {
console.log(`我叫${this.name}今年${this.age}`);
}
}
let n = new Zi()
n.show()
// 接口继承一个类
interface Lei extends Zi {
// name:string = "ss" 类不可以赋值
name: string
}
// 继承一个 类 同时可以继承一个接口
class Star extends Zi implements Lei {
name: string = "张四"
age: number = 12;
sex: string = "男";
each: string = "吃不饱";
}
let p = new Star()
console.log(p.name);
export default {}
class Fu {
name: string = "张三"
age: number = 34
constructor() {
console.log(`我叫${this.name}我今年${this.age}`);
}
}
class Zi extends Fu {
name: string = "张四"
age: number = 54
constructor() {
super()
console.log(`我叫${this.name}今年${this.age}`);
}
}
let s = new Zi
export default {}
// 简单的数组
// const arr: string[] = ["嗡嗡嗡", "喂喂喂", "呜呜呜"]
// console.log(arr);
// const arr1: number[] = [1, 2, 3, 4, 5, 6]
// console.log(arr1);
// const arr2: Array = [1, 2, 3, 4, 5, 6]
// console.log(arr2);
// const arr3: Array = ["嗡嗡嗡", "喂喂喂", "呜呜呜"]
// console.log(arr3);
// let arrArray = (value: number, item: number): number[] => {
// return new Array(item).fill(value)
// }
// let arr4 = arrArray(1, 3)
// console.log(arr4);
let arrArray = (value: T, item: number): T[] => {
return new Array(item).fill(value)
}
let arr4 = arrArray("sss", 3)
console.log(arr4);
export default {}
// function Get(e:T):T{
// console.log(e.length); //类型“T”上不存在属性“length”。
// return e
// }
// function Get(e: Array): Array {
// console.log(e.length);
// return e
// }
// // Get("ss") //类型“string”的参数不能赋给类型“unknown[]”的参数。
// Get(["sss","sss","ss"])
// Get([1,2,3,4])
interface Len {
length: number
}
// 通过继承接口的方式来 加上length
function Ger(e: T): T {
return e
}
Ger("ss")
Ger(["sss", "sss", "ss"])
Ger([1, 2, 3, 4])
将泛型与接口结合起来使用,可以大大简化我们的代码,增强 我们 的代码的可读性
反省也可以使用默认值
export default {}
// interface Iperson {
// name: T1
// age: T2
// }
// let Name: Iperson = {
// name: "张三",
// age: 34
// }
// 简写
interface Iperson {
name: string
age: number
}
let Name: Iperson = {
name: "张三",
age: 34
}
export default {}
class Arr{
// 字段 (属性)
name: T1
age: T2
sex: T1
// 构造函数
constructor(name: T1, age: T2, sex: T1) {
this.name = name
this.age = age
this.sex = sex
}
}
// 实例化对象
let q = new Arr("李四", 19, "男")
console.log(q);
export default {}
// 任何类型都可以赋值给unknown类型
let Mytype1: unknown;
Mytype1 = "李四";
Mytype1 = true;
Mytype1 = 34
// 不能将unknown类型赋值给其他类型
let Mytype2: unknown = 18;
let num: number;
// 类型缩小
if (typeof Mytype2 == "number") {
num = Mytype2
}
// 类型断言
num = Mytype2 as number
// Mytype2 = num //报错 不能将unknown类型赋值给其他类型
// unknown 类型与其他类型组成的交叉类型都是其他类型
type Mytype3 = unknown & number
let number: Mytype3 = 34
// let number1:Mytype3="ss" //报错 他会变成 数字类型number
// unknown 除了与any之外 与其他类型组合的联合类型都是unknown类型
type Mytype4 = unknown | any
type Mytype5 = unknown | number
type Mytype6 = unknown | number | string
// never类型是unknown类型的子类型
type Mytype7 = never extends unknown ? true : false
export default {}
// Map类型
let nameMap = new Map()
// 设置Map对象
nameMap.set("李四", 1)
nameMap.set("王五", 2)
nameMap.set("老六", 3)
// 获取对象的键值
// console.log(nameMap.get("李四")); //1
// 判断Map里面是否包含键对应的值
// console.log(nameMap.has("李四")); //true
// 判断Map键对应值的数量
// console.log(nameMap.size); //3
// 判断一处Map里面所有的键值对
// nameMap.clear()
// console.log(nameMap); //Map(0) {}
// // 迭代Map里面的key
// for (const key of nameMap.keys()) {
// console.log(key); //李四 王五 老六
// }
// // 迭代Map里面的value
// for (const value of nameMap.values()) {
// console.log(value); //1 2 3
// }
// 迭代Map中的key=>value
for (const entry of nameMap.entries()) {
console.log(entry);
}
// 适用对象解析
for (const [key, value] of nameMap) {
console.log(key, value);
}
export default {}
type Mytype = T extends string ? string : any
type res = Mytype
interface IName {
name: string
}
interface TAge {
name: number
}
type Condition = T extends string ? IName : TAge
function reLoad(idOrNmae: T): Condition {
throw ""
}
let res1 = reLoad("三十三")
let res2 = reLoad(34)
console.log(res1);
console.log(res2);
export default {}
type Name = "person" | "animal"
type Person = {
name: string
age: number
}
type NewType = Record;
let res: NewType =
{
person: {
name: "富兰克林",
age: 16
},
animal: {
name: "小查",
age: 3
}
}
console.log(res);
interface TPerson {
name: string
age: number
}
type Mytype = Pick
let res2: Mytype = {
name: "崔弗"
}
装饰器的主要作用是给一个已有的方法或类扩展一些新的行为,而不去直接修改他的本身
1.要先修改 tsconfig.json文件
案例
export default {}
function fn(constructure: any) {
constructure.prototype.name = "李四"
constructure.prototype.show = () => {
console.log(`我叫${constructure.prototype.name}`);
}
}
@fn
class Person {
}
let n = new Person();
(n as any).show();
console.log((n as any).name);
装饰器工厂也是一个函数,它的返回值是一个函数,返回的函数作为修饰器的调用函数,如果使用装饰器工厂,那么在使用的时候就要加上函数的调用
export default {}
function fn(flag: boolean) {
if (flag) {
return function (constructure: any) {
constructure.prototype.name = "李四"
constructure.prototype.show = (): void => {
console.log(`我叫${constructure.prototype.name}`);
}
}
} else {
return function (constructure: any) {
constructure.prototype.show = (): void => {
console.log("hello world");
}
}
}
}
@fn(false)
class Person {
}
let n = new Person();
(n as any).show();
// console.log((n as any).name);
介绍:除了传统的面向对象继承方式,还流行一种通过可重用组件类的方式,就是联合另一种简单类的代码
作用:解决TS中继承一次只能 继承一个类的问题
注意点:类的混入不能混入属性名
export default {}
let str = { name: "李四" };
let num = { age: 34 };
// Object.assign(str, num);
// console.log(str);
// console.log(num);
Object.assign(num, str);
console.log(str);
console.log(num);
TS中的模块
import Text = require("./muduleText")
class Person implements Text.str {
name = "李四"
age = 34
sex = "男"
show() {
console.log(`他叫${this.name}今年${this.age}岁性别${this.sex}`);
}
}
var p = new Person()
console.log(p);
// 直接在公共ts里面赋值 在这里引用
import { nae } from "./muduleText";
console.log(nae);
公共样式
export interface str {
name: string
age: number
sex: string
show(): void
}
export let nae = { uname: "王五" }
在TS1.5之前被 叫做内部模块主要用于组织代码,避免命名冲突
本质就是一个定义一个大对象,把变量方法类接口...都放到里面
通过export导出
通过namespace定义
namespace A {
export const a = 100
export namespace B {
export const b = 200
}
}
namespace Q {
export const a = 100
export namespace B {
const b = 200
}
}
// 1
console.log(A.a); //100
// 简化命名空间
import b = A.B.b
console.log(b); //100
// 3
import { W } from "./namespaceText";
console.log(W.w);
公共样式
export namespace W {
export const w = 10000;
}