TypeScript 学习之路进阶版 - 泛型
泛型 泛型是指在定义函数、接口或者类的时候,不预选指定类的具体累心,而是在使用的时候在指定类型的一种特性
123456789function createArray<T>(length: number, value: T): Array<T> { let result: T[] = []; for (let i = 0; i < length; i++) { result[i] = value; } return result;}createArray<string>(3, 'x'); // ['x', 'x', 'x']
我们在函数名后添加了<T>, 其中T用来指代任意输入的类型,在后面的输入和输出都可以使用
在调用的时候可以指定他的具体的类型,也可以不指定,而让类型推论自动推算出来
多个类型参数
定义泛型的时候,可以一次定义多个类型参数
12345function s ...
typescript 学习之路进阶版 - 2
类和接口 类实现接口 实现(implements)是面向对象中一个重要概念,一般来讲,一个类只能继承自另一个类,有时候不同类之间可以有一些共有特性,这时候可以把特新提取成接口(interfaces), 用implements关键字来实现,这个特新大大提高了面向对象的灵活性
1234567891011121314151617interface Alarm { alert(): void}class Door {}class SecurityDoor extends Door implements Alarm { alert() { console.log('securityDoor) }}class Car implements Alarm { alert() { console.log('car') }}
一个类可以实现多个接口
12345678910interface Alarm { a ...
Deno 学习
首先我们先谈一下nodeJs的无法忽视的问题
nodeJs对于 ES6的新的语法特性 Promise接口 和async函数 和ES模块 的支持并不理想, NodeJs 必须支持回调函数(callback) 导致异步接口会有promise 和回调函数两种写法,同时NodeJs自己的模块格式 CommonJs和ES模块不兼容
nodeJs 的模块管理工具 npm 的逻辑越来越复杂, 模块安装目录极其庞大,难以管理, nodeJs 几乎没有安全措施,用户只要下载了外部模块,就只好任凭别人代码在本地运行,进行各种读写操作
什么是Deno
Deno和nodeJs一样,也是一个服务器运行,但是支持多种语言,可以直接运行在JavaScript,TypeScript和WebAssembly程序
并且内置了V8引擎,用来解释JavaScript,同时,也内置了tsc引擎,解释TypeScript,使用Rust语言开发, 由于Rust原生支持WebAssemly, 所以它也能直接运行WebAssemly
Rust 提供了许多现成的模块,对Deno项目来说,可以节约很多开发时间
Deno 只 ...
typescript 学习之路进阶版
类型别名12345678910type Name = string;type NameResolver = () => string;type NameOrResolver = Name | NameResolver;function getName(n: NameOrResolver): Name { if (typeof n === 'string') { return n; } else { return n(); }}
类型别名为类型创建新名称。类型别名有时类似于接口,但是可以命名原语,并集,元祖和其他必须手动编写的其他类型。
别名实际上并不会创建新的类型,他会创建一个新名称来引用该类型123456789101112131415161718192021222324type Container<T> = {value: T}// 也可以在属性中使用类型别名来引用自身type Tree<T> = { ...
python学习之路----制作小游戏
安装pygame
1pip install pygame
引入12import pygamefrom pygame.locals import *初始化1pygame.init()
创建一个窗口12screen = pygame.display.set_mode([800,600])// 生成一个 宽800 高600大小的窗口使窗口正常工作1234567// pygame的作用就是为了创建游戏,需要与玩家不断互动,所以需要一个事件一直循环运行,使用while 执行事件循环while True:// 接下来增加事件处理器,pygame包含多种模块,使用paygame.event.get()方法获取所有事件的一个列表,使用for循环迭代处理这个列表中的每一个事件,如果看到quit事件,将while 判断设为false 结束while循环for event in pygame.event.get(): if event.type == pygame.QUIT: mRuning = False pygame.quit()
翻转 flip对于pygame窗口显示的内容,scree ...
用typescript来写eggjs
由于用javasript的某种限制和不足,所以决定使用typescript来写eggjs
初始化typescript1npm init egg --type=ts
使用数据库1npm i --save egg-sequelize mysql2
/config/plugins.ts1234sequlize: { enable: true, package: 'egg-sequelize', },/config/config.default.ts12345678config.sequelize = { dialect: 'mysql', host: 'localhost', port: 3306, password: '123456', database: 'eic-egg', timezone: '+08:00', };
eggjs 配置swagger-ui
如何在eggjs中搭建一个swagger-ui接口预览文档?下面这篇文章将会教你如何搭建swagger-ui参考文章
安装egg-swagger-doc 插件1npm install egg-swagger-doc -S
配置egg-swagger-doc 默认配置
1234567891011121314151617181920212223242526272829303132333435363738394041// plugin.js or plugin.tsconfig.swaggerdoc: { enable: true, // 是否启用。 package: 'egg-swagger-doc', // 指定包名称。 }// config.default.js or config.default.ts// egg-swagger-doc 配置信息。 exports.swaggerdoc = { dirScanner: './app/controller', // 配置自动扫描的控制器路径。 ...
D3.js的学习之路
引入html中引入1<script src="https://cdn.bootcdn.net/ajax/libs/d3/5.16.0/d3.js"></script>
核心函数d3.js是链式操作,和promise结构类似,函数执行的返回值都是函数本身
选择器选择元素
D3提供了两种方法来选择元素
d3.select() 返回单元素选择结果,没有匹配的则返回空,多个匹配只返回第一个匹配的元素
d3.select(selector)
d3.select(node) 选中指定节点,如果已经引用了一个节点.例如时间监听器的d3.select(this),或者一个全局对象,例如document.body,这个函数不会便利DOM树
d3.selectAll() 返回选中的所有元素,按照文档的遍历顺序,从上到下选择,如果文档中没有匹配的元素则返回空的选择
d3.selectAll(selector)
d3.selectAll(nodes) 如果有元素已被引用,例如事件监听器中的d3.selectAll(this.childNodes),或者一个 ...
使用canvas绘制碰撞球
实现步骤
绘制canvas,并将canvas的宽高设置为品目的宽高 由于canvas是行内元素,行内元素一般都有自己的行高等,所以一般会出现横向滚动条,此时需要将canvas设置为块级元素或者行内块状元素
设置canvas的宽高跟随屏幕大小的变化而变化,使用window.onresize监听屏幕变化
设置画布属性(canvas.getContext() 2d or 3d)
填充颜色 (canvas.fillStyle())
首先绘制出一个圆形,设置圆心位置,半径,和园的角度 canvas.arc(x,y,r,deg1,deg2,true/false) canvas.fillStyle() 填充颜色
将绘制圆形的方法进行封装成一个类,通过调用这个类来循环生成圆形
绘制圆形的运行轨迹,在封装好的类的基础上添加一个移动方法,然后设置定时器,每隔固定时间清除canvas并重新绘制
调整圆形运行轨迹,当圆形触边的时候,使圆形发生反弹 触及x轴,y的移动方向相反,触及y轴,x轴的移动方向相反
实现代码12345678910111213141516171819202122232425262 ...
javascript之arguments.callee
arguments.callee 在哪个函数中执行,它就代表哪个函数,通常用于匿名函数中在匿名函数中,有时需要自己调用自己,但是由于是匿名函数,没有名字,无法调用,这时可以用arguments.callee来代替匿名的函数
1234567(function(n) => { if(n > 1) { return n * arguments.callee(n-1) } else { return n }})()
or123456789// 也是立执行函数的一种~~function(n) => { if(n > 1) { return n * arguments.callee(n-1) } else { return n }}()
计算n的阶乘