当前位置: 首页 > news >正文

typescript 命名空间、装饰器

1、命名空间

 命名空间:在代码量较大的情况下,为了避免各种变量命名的冲突,可将相似功能的函数、类、接口等放置到命名空间内。同Java的包.Net的命名空间一样,typescript 的命名空间可以将代码包裹起来,只对外暴露需要在外部访问的对象

命名空间和模块的区别:

命名空间:内部模块,主要用于组织代码,避免命名冲突。 

模块:ts的外部模块的简称,侧重代码的复用,一个模块里可能会有多个命名空间。


namespace A {interface Animal {name: string;eat(): void}export class Dog implements Animal {name: string;constructor(name: string) {this.name = name}eat() {console.log(`${this.name}汪汪`);}}class Cat implements Animal {name: string;constructor(name: string) {this.name = name}eat() {console.log(`${this.name}喵喵`);}}}// 想在外部使用命名空间里的方法 需要先暴露 命名空间.调用
let d = new A.Dog('小狗')
d.eat();/* 也可以将命名空间模块化,引入export namespace A
*/

2、装饰器

 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为。

通俗的讲装饰器就是一个方法,可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。

常见的装饰器有:类装饰器、属性装饰器、方法装饰器、参数装饰器

装饰器的写法:普通装饰器(无法传参)、装饰器工厂(可传参)

(1)类装饰器:类装饰器是在类声明之前被声明(紧靠着类声明) 。类装饰器应用于类构造函数,可以用来监视,修改或替换类定义。传入一个参数

普通装饰器

function logClass(params: any) {// params 就是当前类console.log(params, 'params');// 动态扩展属性params.prototype.apiUrl = 'http://'params.prototype.run = function () {console.log('我是扩展的方法');}
}
// 调用装饰器
@logClass
class HttpClient {constructor() {}getData() {}
}
var http = new HttpClient()
console.log(http.apiUrl);
http.run()

装饰器工厂(可传参)

function logClass(params: string) {return function (target: any) {console.log(target, '当前类');console.log(params, '接收的参数');target.prototype.apiUrl = params}
}
@logClass('http://')
class HttpClient {constructor() {}getData() {}
}
var http = new HttpClient
console.log(http.apiUrl);

类装饰器 重载构造函数

类装饰器表达式会在运行时当作函数被调用,类的构造函数作为其唯一的参数

如果类装饰器返回一个值,它会使用提供的构造函数来替换类的声明


function logClass(target: any) {console.log(target, 'target');// 在装饰器里重载constructorreturn class extends target {apiUrl: any = '我修改了'getData() {this.apiUrl = this.apiUrl + '---'console.log(this.apiUrl);}}
}
@logClass
class HttpClient {public apiUrl: string | undefinedconstructor() {this.apiUrl = '我是构造函数的apiUrl'}getData() {console.log(this.apiUrl);}
}
var http = new HttpClient()
http.getData()

 (2)属性装饰器:属性装饰器表达式会在运行时当作函数被调用,传入2个参数。

                                1、对于静态成员来说是类的构造函数,对于实例成员来说是类的原型对象

                                2、成员的名字

// 属性装饰器
function logProperty(params: any) {// target 类的原型对象return function (target: any, attr: any) {console.log(target, '类的原型对象');console.log(attr, '属性名');console.log(params, '属性传入的值');target[attr] = params}}@logClass('类的传参')
class HttpClient {@logProperty('http')public url: any | undefinedconstructor() { }getData() {console.log(this, 'url');}
}
var http = new HttpClient()
http.getData()

(3)方法装饰器:它会被应用到方法的属性描述符上,可以用来监视,修改或者替换方法定义。

        方法装饰会在运行时传入下列3个参数

        1、对于静态成员来说是类的构造函数,对于实例成员是类的原型对象

        2、成员的名字

        3、成员的属性描述符

function get(params: any) {return function (target: any, methodName: any, desc: any) {console.log(target, '原型对象');console.log(methodName, '方法名');console.log(desc, '描述');target.apiUrl = 'hahaha'target.run = function () {console.log('run');}/* 修改装饰器的方法,把装饰器方法里面传入的所有参数改为string类型1、保存当前方法*/var oMethed = desc.valuedesc.value = function (...args: any[]) {args = args.map((value) => {return String(value)})console.log(args, 'args');// 使用对象冒充修改当前方法,否则会替换原方法oMethed.apply(this, args)}}
}class HttpClient {public url: any | undefinedconstructor() { }@get('http://')getData(...args: any[]) {console.log(args);console.log(this.url, '我是getData');}
}var http: any = new HttpClient()
console.log(http.apiUrl, 'apiUrl');
http.run()
http.getData(132, '8545')

 

相关文章:

typescript 命名空间、装饰器

1、命名空间 命名空间:在代码量较大的情况下,为了避免各种变量命名的冲突,可将相似功能的函数、类、接口等放置到命名空间内。同Java的包.Net的命名空间一样,typescript 的命名空间可以将代码包裹起来,只对外暴露需要在…...

GPT问答SAP BW

以下回答由GPT-3.5回答,仅供参考. 这个AI工具超好用,每天都有免费额度,写文章、总结长视频、画图等,都几秒搞定!快去下载Sider Chrome或Edge插件,薅羊毛! https://sider.ai/invited?c43b289bf2616575daecf…...

使用zdppy_amauth开发激活用户接口

服务端代码: 1、创建数据库连接对象2、初始化数据库3、声明一个上下文4、挂载用户相关的路由,这里主要由 用户登录接口用户注册注册获取用户列表接口激活指定用户接口 5、启动服务 import mcrud import api import amauth import env import contextli…...

c++ memset 指针示例

目录 C 传一个float指针&#xff0c;在函数内部修改指针的值 c memset 指针示例 C 传一个float指针&#xff0c;在函数内部修改指针的值 #include <iostream>// 定义一个函数&#xff0c;它接受一个指向float的指针 void modifyValue(float* ptr) {// 通过解引用指针来…...

24考研双非上岸武汉理工大学电子信息专硕,855考研经验

目录 一、考研择校经验 二、武理考研初试经验 三、武理考研复试经验 一、考研择校经验 我建议学弟学妹们确定院校时没必要一上来就说我一定要考某个院校。其实考哪个学校是要在考研备考的过程中慢慢探索&#xff0c;慢慢研究的&#xff0c;不过最晚9月初一定要确定院校了&a…...

使用KubeKey 快速交付k8s v1.28.8集群

文章目录 服务器配置使用kubekey部署k8s1. 操作系统基础配置2. 安装部署 K8s2.1 下载 KubeKey2.2 创建 K8s 集群部署配置文件 3. 验证 K8s 集群3.1 验证集群状态 4. 部署测试资源5.验证服务 服务器配置 主机名IPCPU内存系统盘数据盘用途vm-16-11-ubuntu192.168.9.131128256Gi5…...

nginx--压缩https证书favicon.iconginx隐藏版本号 去掉nginxopenSSL

压缩功能 简介 Nginx⽀持对指定类型的⽂件进行压缩然后再传输给客户端&#xff0c;而且压缩还可以设置压缩比例&#xff0c;压缩后的文件大小将比源文件显著变小&#xff0c;这样有助于降低出口带宽的利用率&#xff0c;降低企业的IT支出&#xff0c;不过会占用相应的CPU资源…...

通俗的理解网关的概念的用途(四):什么是网关设备?(网络层面)

任何一台Windows XP操作系统之后的个人电脑、Linux操作系统电脑都可以简单的设置&#xff0c;就可以成为一台具备“网关”性质的设备&#xff0c;因为它们都直接内置了其中的实现程序。MacOS有没有就不知道&#xff0c;因为没用过。 简单的理解&#xff0c;就是运行了具备第二…...

Spring JdbcTemplate实现自定义动态sql拼接功能

需求描述&#xff1a; sql 需要能满足支持动态拼接&#xff0c;包含 查询字段、查询表、关联表、查询条件、关联表的查询条件、排序、分组、去重等 实现步骤&#xff1a; 1&#xff0c;创建表及导入测试数据 CREATE TABLE YES_DEV.T11 (ID BINARY_BIGINT NOT NULL,NAME VARCH…...

第十一篇:操作系统新纪元:智能融合、量子跃迁与虚拟现实的交响曲

操作系统新纪元&#xff1a;智能融合、量子跃迁与虚拟现实的交响曲 1 引言 在数字化的浪潮中&#xff0c;操作系统如同一位智慧的舵手&#xff0c;引领着信息技术的航船穿越波涛汹涌的海洋。随着人工智能、物联网、量子计算等前沿技术的蓬勃发展&#xff0c;操作系统正站在一个…...

【大数据】学习笔记

文章目录 [toc]NAT配置IP配置SecureCRT配置PropertiesTerminal Java安装环境变量配置 Hadoop安装修改配置文件hadoop-env.shyarn-env.shslavescore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml 环境变量配置 IP与主机名映射关系配置hostname配置映射关系配置 关闭防火墙…...

PHP 框架安全:ThinkPHP 序列 漏洞测试.

什么是 ThinkPHP 框架. ThinkPHP 是一个流行的国内 PHP 框架&#xff0c;它提供了一套完整的安全措施来帮助开发者构建安全可靠的 web 应用程序。ThinkPHP 本身不断更新和改进&#xff0c;以应对新的安全威胁和漏洞。 目录&#xff1a; 什么是 ThinkPHP 框架. ThinkPHP 框架…...

厂家自定义 Android Ant编译流程源码分析

0、Ant安装 Windows下安装Ant&#xff1a; ant 官网可下载 http://ant.apache.org ant 环境配置&#xff1a; 解压ant的包到本地目录。 在环境变量中设置ANT_HOME&#xff0c;值为你的安装目录。 把ANT_HOME/bin加到你系统环境的path。 Ubuntu下安装Ant&#xff1a; sudo apt…...

基于springboot+vue+Mysql的体质测试数据分析及可视化设计

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

uniapp的app端推送功能,不使用unipush

1&#xff1a;推送功能使用htmlPlus实现&#xff1a;地址HTML5 API Reference (html5plus.org) 效果图&#xff1a; 代码实现&#xff1a; <template><view class"content"><view class"text-area"><button click"createMsg&q…...

数据结构(四)————二叉树和堆(中)

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一、堆的概念及结构二、堆的实现三.堆的应用 总结 前言 CSDN 这篇博客介绍了二叉树中的基本概念和存储结构&#xff0c;接下来我们将运用这些结构来实现二叉树 一、堆的概念及结构 1…...

随便写点东西

1 react的高阶组件 1.1 操纵组件的props、对组件的props进行增删&#xff1b; 1.2 复用组件逻辑 服用的组件逻辑&#xff0c;互不影响&#xff1b;比如高阶组件中复用了input框&#xff0c;输入内容是互不影响的&#xff1b; 1.3 可以通过配置装饰器来实现高阶组件&#xff08…...

Mac 报错 Zsh: command not found :brew

Mac 安装其他命令时报错 Zsh: command not found :brew终于找到一个能行的&#xff0c;还能够配置国内下载源&#xff0c;记录一下 执行 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"选择一个开始继续执行即可...

分析师常用商业分析模型

一、背景 在用户调研中&#xff0c;我们发现分析师对商业分析模型的使用还是比较频繁。本文主要对用户调研结果中的分析师常用商业分析模型以及一些业界经典的商业分析模型进行分析&#xff0c;并梳理出执行落地流程&#xff0c;以此来指导分析师工具设计分析功能的引导性。 …...

KMeans,KNN,Mean-shift算法的学习

1.KMeans算法是什么&#xff1f; 在没有标准标签的情况下&#xff0c;以空间的k个节点为中心进行聚类&#xff0c;对最靠近他们的对象进行归类。 2.KMeans公式&#xff1a; 2. 1.关键分为三个部分&#xff1a; 1.一开始会定义n个中心点&#xff0c;然后计算各数据点与中心点…...

告别乱码!5分钟搞懂串口通信中的帧结构与CRC校验(附协议.h/.c文件)

串口通信实战&#xff1a;从帧结构设计到CRC校验的完整实现指南 当你第一次尝试用串口发送"Hello World"时&#xff0c;数据像流水般顺畅。但当你开始传输传感器读数或控制指令时&#xff0c;突然发现接收端时不时出现乱码或数据错位——这就像试图在嘈杂的酒吧里进行…...

MPO光纤跳线:从结构解析到数据中心高密度布线实战

1. MPO光纤跳线&#xff1a;高密度布线的秘密武器 第一次接触MPO光纤跳线时&#xff0c;我被它的"小身材大容量"震惊了。这个看起来和普通SC连接器差不多大小的家伙&#xff0c;居然能塞下12根甚至24根光纤&#xff01;这就像在普通U盘大小的空间里装下了整个移动硬盘…...

Alexa Skills Kit SDK SMAPI 集成:自动化技能管理和部署的完整流程

Alexa Skills Kit SDK SMAPI 集成&#xff1a;自动化技能管理和部署的完整流程 【免费下载链接】alexa-skills-kit-sdk-for-nodejs The Alexa Skills Kit SDK for Node.js helps you get a skill up and running quickly, letting you focus on skill logic instead of boilerp…...

Emotion2Vec+语音情感识别系统:5分钟快速部署,9种情绪一键分析

Emotion2Vec语音情感识别系统&#xff1a;5分钟快速部署&#xff0c;9种情绪一键分析 1. 系统介绍与核心价值 1.1 什么是Emotion2Vec Emotion2Vec是一款基于深度学习的语音情感识别系统&#xff0c;能够自动分析语音中蕴含的情绪状态。这个由科哥二次开发构建的镜像版本&…...

Phi-4-mini-reasoning在ollama中启用flash attention:推理速度提升实测报告

Phi-4-mini-reasoning在ollama中启用flash attention&#xff1a;推理速度提升实测报告 你是否遇到过这样的场景&#xff1a;部署了一个轻量级推理模型&#xff0c;满怀期待地输入问题&#xff0c;结果等待了十几秒才得到回复&#xff1f;对于需要快速响应的应用&#xff0c;比…...

Java函数冷启动优化不是“选配”,而是SLA硬指标!一线大厂SRE团队正在紧急落地的6项Kubernetes调度增强策略

第一章&#xff1a;Java函数冷启动的本质与SLA倒逼机制Java函数冷启动并非单纯“首次加载慢”的表象&#xff0c;而是JVM生命周期、类加载机制、字节码验证、即时编译&#xff08;JIT&#xff09;预热及运行时元数据初始化等多层系统行为在无预热上下文下的集中爆发。当Serverl…...

基于yz-bijini-cosplay的.NET应用开发:AI功能集成实践

基于yz-bijini-cosplay的.NET应用开发&#xff1a;AI功能集成实践 1. 为什么要在.NET应用里集成cosplay风格生成能力 最近有好几位做数字内容平台的朋友问我&#xff1a;“我们给动漫爱好者提供社区服务&#xff0c;能不能在自己的App里直接生成角色同款泳装或Cosplay造型&am…...

Granite TimeSeries FlowState R1实战:基于卷积神经网络(CNN)的时序特征提取进阶

Granite TimeSeries FlowState R1实战&#xff1a;基于卷积神经网络&#xff08;CNN&#xff09;的时序特征提取进阶 你是不是也遇到过这样的问题&#xff1f;面对一长串传感器读数、股票价格波动或者服务器监控数据&#xff0c;感觉信息量巨大&#xff0c;却不知道从哪里入手…...

运维实战:思科NAT配置全解析与典型场景应用

1. 为什么企业网络离不开NAT技术 想象一下你公司的内网有200台电脑&#xff0c;但ISP只分配了5个公网IP地址——这就是NAT技术大显身手的场景。作为网络工程师&#xff0c;我处理过太多类似案例&#xff0c;最夸张的一个客户用1个公网IP支撑了整个500人办公区的上网需求。 NA…...

【Unity 贪吃蛇大作战模板】高并发IO游戏怎么做?拆解Snake Warz核心架构

Snake Warz IO 是一个基于 Photon Fusion v2 构建的多人在线贪吃蛇游戏完整模板。它不仅提供了可直接上线的游戏内容&#xff0c;还涵盖了完整的多人联机框架、AI系统、UI流程以及跨平台适配能力。该插件支持最多 10 名真实玩家与 30 个 AI 同场竞技&#xff0c;并提供多种游戏…...