带你了解Typescript的14个基础语法
本文分享自华为云社区《Typescript基础语法全解析》,作者:北极光之夜。 。 一.Ts是什么: 首先,强类型不允许随意的隐式类型转换,而弱类型是允许的。JavaScript就是经典的弱类型语言。而Typescript可以说是JavaScript的超集,在JS的基础上新增了许多语法特性,使得类型不再可以随意转换,能大大减少开发阶段的错误。 二. 基本语法: 1.声明原始数据类型: 在变量后面指定一个关键字表示其只能为什么类型。 string类型:
|
1 |
const a: string = 'auroras' |
number类型:
|
1 |
const b: number = 666 // 包括 NAN Infinity |
boolean类型:
|
1 |
const c: boolean = true |
null类型:
|
1 |
const d: null = null |
undefined类型:
|
1 |
const e: undefined = undefined |
symbol类型:
|
1 |
const h: symbol = Symbol() |
2.声明Object类型: 首先,object类型不单单可以指定对象,还可以指定数组或函数:
|
1 2 3 |
const foo1: object = {}; const foo2: object = []; const foo3: object = function(){}; |
如果只想指定为对象,如下,对象属性都要提前声明好类型:
|
1 2 3 4 |
const obj: {name: string,age: number} = { name: '北极光', age:18 } |
3.1声明数组类型: 可以指定声明Array且通过<>指定元素类型,比如指定声明元素都为数字的数组:
|
1 |
const arr: Array<number> = [1,2,3] |
第二种方式如下,也指定声明元素都为数字的数组:
|
1 |
const arr: number[] = [1,2,3] |
3.2声明元组类型: 就是要提前指定数组里每个元素的类型,严格一一对应:
|
1 |
const tuple: [number,string,boolean] = [666,'auraros',true] |
4.声明枚举类型: 通过关键字enum声明一个枚举类型,如:
|
1 2 3 4 5 6 7 |
enum Status { pedding = 1, resolve = 2, reject = '3' } //访问 console.log(Status.pedding); |
如果全不写值,默认值为从0开始递增。如果第一个元素为字符类型,就必须全部定义值。如果第一个元素指定为一个数字,后面元素不写值,那值为第一个元素值按位置大小递增的结果。 5.函数参数与返回类型: 函数声明式: 指定函数传入参数类型,指定返回值类型,调用时传入参数个数与类型都必须相同: 括号里指定每个参数类型,括号右边指定返回值的类型。
|
1 2 3 4 |
function fun (name:string,age:number):string{ return 'sss' } fun('auroras',18); |
如果传入参数不确定传不传,那么可以给参数加个‘?’表明它是可选的:
|
1 2 3 4 |
function fun (name:string,age?:number):string{ return 'sss' } fun('auroras'); |
或者给参数添加默认值,那也会成为可选参数:
|
1 2 3 4 |
function fun (name:string,age:number=666):string{ return 'sss' } fun('auroras'); |
如果参数个数不确定,可以用扩展运算符加解构赋值表示,当然要传入与指定类型一致的:
|
1 2 3 4 |
function fun (name:string,age:number=666,...res:number[]):string{ return 'sss' } fun('auroras',1,2,3); |
函数表达式:
|
1 2 3 |
const fun2:(name:string,age:number)=>string = function(name:string,age:number){ return 'sss' } |
定义接口时再详细说。 6.任意类型: 通过指定any关键字表示任意类型,跟原来 js 一样,可以任意赋不同类型的值:
|
1 2 3 |
let num:any = 1; num = 'a'; num = true; |
7.类型断言: 类型断言就是明确的告诉typescript这个变量就是某种类型的,百分之百确定。不用typescript在一些情况下要自己推断某些没有明确定义或者多变的场景是什么类型。 可以通过 as+类型 断言它就是某种类型的:
|
1 2 |
const res = 1; const num = res as number; |
也可以通过 <类型> 形式断言(不推荐):
|
1 2 |
const res = 1; const num = <number>res |
8.接口基本使用: 接口可以理解为一种规范,一种契约。可以约束一个对象里应该有哪些成员,这些成员都是怎么样的。 […]
View Details最全的 Vue 面试题+详解答案
前言 本文整理了高频出现的 Vue 相关面试题并且附带详解答案 难度分为简单 中等 困难 三种类型 大家可以先不看答案自测一下自己的 Vue 水平哈 如果对原理感兴趣的同学 欢迎查看小编的手写 Vue 源码系列文章 如果对答案有不一样见解的同学欢迎评论区补充讨论 最后欢迎大家点击 链接 加入到鲨鱼哥的前端群 内推 讨论技术 摸鱼 求助 皆可(进群免费领取 Vue2 源码思维导图哈) 整理不易 如果觉得本文有帮助 记得点赞三连哦 十分感谢! 简单 1 MVC 和 MVVM 区别 MVC MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范 Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据 View(视图):是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的 Controller(控制器):是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据 MVC 的思想:一句话描述就是 Controller 负责将 Model 的数据用 View 显示出来,换句话说就是在 Controller 里面把 Model 的数据赋值给 View。 MVVM MVVM 新增了 VM 类 ViewModel 层:做了两件事达到了数据的双向绑定 一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。 MVVM 与 MVC 最大的区别就是:它实现了 View 和 Model 的自动同步,也就是当 Model 的属性改变时,我们不用再自己手动操作 Dom 元素,来改变 View 的显示,而是改变属性后该属性对应 View 层显示会自动改变(对应Vue数据驱动的思想) 整体看来,MVVM 比 MVC 精简很多,不仅简化了业务与界面的依赖,还解决了数据频繁更新的问题,不用再用选择器操作 DOM […]
View Details最全的TypeScript学习指南
前言 Hello 大家好 我是鲨鱼哥 这次给大家带来的是我曾经非常嫌弃 如今却爱不释手的 TS 技术 哈哈 大家看往期文章可能已经发现鲨鱼哥之前主要是 Vue 技术栈的 然后因为 Vue2 和 TS 的结合总感觉不是很丝滑 所以我果断就在技术选型的时候去掉了 TS(其实我是觉得用起来很烦 和我之前最讨厌的 eslint 一样 各种报错让人不爽)但是 鲨鱼哥今年换了新公司 开启了全新的 react hook+ts 这一套组合拳 然后在重新认真学习并在项目里用上了 ts 之后 确实真香 哈哈 最直观的感受就是可以帮我们规避很多类型错误 更友好的提示 甚至有些方法我们根据定义的类型大概就知道作用是什么了(去掉了写注释的麻烦)况且如今大火的 Vue3 也是 TS 重构的 然后 react 和 ts 的结合就更不必说了 所以还没有开始 ts 的同学就从现在开始跟着鲨鱼哥一起来学习吧 最后欢迎大家点击 链接 加入到鲨鱼哥的前端群 内推 讨论技术 摸鱼 求助 皆可 整理不易 如果觉得本文有帮助 记得点赞三连哦 十分感谢! 1 ts 安装和编译 第一步 新建一个空文件夹用来学习 ts 第二步 全局安装 ts 和 ts-node
|
1 2 |
cnpm i typescript -g //全局安装ts cnpm i -g ts-node //全局安装ts-node |
第三步 生成 tsconfig.js 配置文件
|
1 |
tsc --init |
我们就先按照自动生成的 tsconfig 配置项去使用 里面的配置咱们可以先不去管他 后续熟练了再去配置 第四步 在项目下新建一个index.ts 直接写入
|
1 2 |
const a: string = "hello"; console.log(a); |
[…]
View DetailsTypeScript+Vue实例完全教程
功能 轮播 搜索 列表 懒加载 简单动画 loading vue-router.ts vuex.ts vue-class-component使用 vuex-class使用 xxx.d.ts声明文件 基于类的编写方式 mock数据 tsconfig.json webpack配置 vue-typescript-cli 项目地址:https://github.com/SimonZhangITer/vue-typescript-dpapp-demo 完成后的简单例子 基于类的写法加上静态类型检查,简直不能再嗨
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<script lang="ts"> import Vue from "vue"; import Component from "vue-class-component"; import { State } from "vuex-class"; @Component export default class Shops extends Vue { @State shops: StoreState.shop[]; @State searchVal: string; get shopList(): StoreState.shop[] { const shops = this.shops; const searchVal = this.searchVal; return shops.filter( (el: StoreState.shop) => el.shopName.indexOf(searchVal) > -1 ); } } </script> |
为什么使用TypeScript JavaScript的超集 支持所有原生JavaScript的语法 强类型语言 现在很多主流语言都是强类型的,而这点也一直是JavaScript所被人诟病的地方。使用TypeScript之后,将会在代码调试、重构等步骤节省很多时间。 比如说:函数在返回值的时候可能经过复杂的操作,那我们如果想要知道这个值的结构就需要去仔细阅读这段代码。那如果有了TypeScript之后,直接就可以看到函数的返回值结构,将会非常的方便 强大的IDE支持 现在的主流编辑器如VSCode、WebStorm、Atom、Sublime等都对TypeScript有着非常友好的支持,主要体现在智能提示上,非常的方便 可运行于任何浏览器、计算机、操作系统 强大的编译引擎 迭代更新快 不断更新,提供更加方便友好的Api 微软和Google爸爸 TypeScript是微软开发的语言,而Google的Angular使用的就是TypeScript,所以不用担心会停止维护,至少在近几年内TypeScript都会一门主流开发语言 npm下载量非常高 截止2017.12.17, TypeScript在全球范围内的npm日均下载量在30w左右,这个数字将近是vue下载量的10倍,可见TypeScript还是非常受欢迎的 TypeScript配置 本项目已经配置完毕,这里记录一下当时的踩坑过程 1. Webpack 首先需要安装ts-loader,这是TypeScript为Webpack提供的编译器,类似于babel-loader
|
1 |
npm i ts-loader -D |
接着在Webpack的module.rules里面添加对ts的支持(我这里的webpack版本是2.x):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConfig }, { test: /\.tsx?$/, exclude: /node_modules/, use: [ "babel-loader", { loader: "ts-loader", options: { appendTsxSuffixTo: [/\.vue$/] } } ] } |
2. tsconfig.json 创建tsconfig.json文件,放在根目录下,和package.json同级 配置内容主要也看个人需求,具体可以去typescript的官网查看,但是有一点需要注意: 在Vue中,你需要引入 strict: true (或者至少 noImplicitThis: true,这是 strict 模式的一部分) 以利用组件方法中 this 的类型检查,否则它会始终被看作 any 类型。 这里列出我的配置,功能在注释中给出
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
{ "include": [ "src/*", "src/**/*" ], "exclude": [ "node_modules" ], "compilerOptions": { // types option has been previously configured "types": [ // add node as an option "node" ], // typeRoots option has been previously configured "typeRoots": [ // add path to @types "node_modules/@types" ], // 以严格模式解析 "strict": true, // 在.tsx文件里支持JSX "jsx": "preserve", // 使用的JSX工厂函数 "jsxFactory": "h", // 允许从没有设置默认导出的模块中默认导入 "allowSyntheticDefaultImports": true, // 启用装饰器 "experimentalDecorators": true, "strictFunctionTypes": false, // 允许编译javascript文件 "allowJs": true, // 采用的模块系统 "module": "esnext", // 编译输出目标 ES 版本 "target": "es5", // 如何处理模块 "moduleResolution": "node", // 在表达式和声明上有隐含的any类型时报错 "noImplicitAny": true, "lib": [ "dom", "es5", "es6", "es7", "es2015.promise" ], "sourceMap": true, "pretty": true } } |
3. 修改main.js 把项目主文件main.js修改成main.ts,里面的写法基本不变,但是有一点需要注意: 引入Vue文件的时候需要加上.vue后缀,否则编辑器识别不到 把webpack的entry文件也修改成main.ts 4. vue-shims.d.ts TypeScript并不支持Vue文件,所以需要告诉TypeScript*.vue文件交给vue编辑器来处理。解决方案就是在创建一个vue-shims.d.ts文件,建议放在src目录下再创建一个typings文件夹,把这个声明文件放进去,如:src/typings/vue-shims.d.ts,文件内容: *.d.ts类型文件不需要手动引入,TypeScript会自动加载
|
1 2 3 4 |
declare module '*.vue' { import Vue from 'vue' export default Vue } |
到这里TypeScript在Vue中配置就完成了,可以愉快的撸代码了~ 第三方插件库 现在Vue官方已经明确提出支持TypeScript,并考虑出一个对应的vue-cli,在这之前,Vue开发团队已经开发出了一些插件库来支持TypeScript,这里简单和大家介绍一下。 Vue-Class-Component vue-class-component是官方维护的TypeScript装饰器,写法比较扁平化。Vue对其做到完美兼容,如果你在声明组件时更喜欢基于类的 API,这个库一定不要错过 ps:用了这个装饰器之后写方法不需要额外加逗号,贼嗨~~~
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import Vue from "vue"; import Component from "vue-class-component"; @Component export default class App extends Vue { name:string = 'Simon Zhang' // computed get MyName():string { return `My name is ${this.name}` } // methods sayHello():void { alert(`Hello ${this.name}`) } mounted() { this.sayHello(); } } |
[…]
View DetailsLinux目录创建、删除软链接
创建软链接
|
1 |
ln -s /www/jthycore/Upload /www/jthycore/wwwroot/ |
删除软链接
|
1 |
rm -rf /www/jthycore/wwwroot/Upload |
View Details
.NET Core log4net 使用
log4net .NET Core 版使用,log4net 2.0.7版发布也有一段时间了,从2.0.6 版开始就已经支持.NET Core。 之前有介绍NLog .NET Core版的使用,ASP.NET Core 开发-Logging 使用NLog 写日志文件。 ASP.NET Core已经内置了日志支持,可以轻松输出到控制台。使用log4net 将日志写入到文件及输出控制台。 .NET Core项目使用 新建一个 .NET Core 项目,选择控制台应用程序。 添加引用: Install-Package log4net 使用简单配置,将日志输出至控制台,跟之前.NET 版本略微有些区别,需要指定Repository 。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public static void Main(string[] args) { ILoggerRepository repository = LogManager.CreateRepository("NETCoreRepository"); // 默认简单配置,输出至控制台 BasicConfigurator.Configure(repository); ILog log = LogManager.GetLogger(repository.Name,"NETCorelog4net"); log.Info("NETCorelog4net log"); log.Info("test log"); log.Error("error"); log.Info("linezero"); Console.ReadKey(); } |
运行程序显示如下: 下面增加配置,让其输出至文件。 在项目中添加一个配置文件,这里添加一个log4net.config ,内容如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- This section contains the log4net configuration settings --> <log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" /> </appender> <appender name="FileAppender" type="log4net.Appender.FileAppender"> <file value="log-file.log" /> <appendToFile value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="logfile/" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <staticLogFileName value="false" /> <datePattern value="yyyyMMdd'.log'" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="1MB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!-- Setup the root category, add the appenders and set the default level --> <root> <level value="ALL" /> <appender-ref ref="ConsoleAppender" /> <appender-ref ref="FileAppender" /> <appender-ref ref="RollingLogFileAppender" /> </root> </log4net> </configuration> |
这里定义了三个 Appender,都会起作用,然后日志级别ALL 所有的日志都会记录。 更改Program.cs 代码如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void Main(string[] args) { ILoggerRepository repository = LogManager.CreateRepository("NETCoreRepository"); <strong>XmlConfigurator.Configure(repository, new FileInfo("log4net.config"</strong><strong>));</strong> ILog log = LogManager.GetLogger(repository.Name,"NETCorelog4net"); log.Info("NETCorelog4net log"); log.Info("test log"); log.Error("error"); log.Info("linezero"); Console.ReadKey(); } |
加了指定配置文件。运行程序会生成一个文件夹和一个文件,因为重新定义了ConsoleAppender,控制台输出也有所不同。 ASP.NET Core项目使用 在ASP.NET Core 使用也是一样,可以在Program.cs或Startup.cs 中指定Repository,然后控制器或中间件中获取对象使用。 以下代码是在Startup 构造函数中初始化log4net
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Startup { public static ILoggerRepository repository { get; set; } public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); repository = LogManager.CreateRepository("NETCoreRepository"); XmlConfigurator.Configure(repository, new FileInfo("log4net.config")); } |
然后在Configure 中加了一个记录日志
|
1 2 3 4 |
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { var log = LogManager.GetLogger(repository.Name,typeof(Startup)); log.Info("test"); |
在HomeController 也增加了:
|
1 2 3 4 5 6 7 |
private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(HomeController)); public IActionResult Index() { log.Info("index view"); log.Error("Controller Error"); return View(); } |
运行应用结果如下,然后对应的文件会有日志记录。 对于输出中文乱码,需要增加编码引用,以及代码。NLog 那篇文章有介绍。写到日志文件是没有问题的。 参考文档: http://logging.apache.org/log4net/release/manual/configuration.html http://logging.apache.org/log4net/release/config-examples.html 如果你觉得本文对你有帮助,请点击“推荐”,谢谢。 ASP.NET Core 3.1 新书发布 《ASP.NET Core项目开发实战入门》 京东当当淘宝 GitHub:https://github.com/linezero 博客示例代码GitHub:https://github.com/linezero/Blog from:https://www.cnblogs.com/linezero/p/log4net.html
View Details.netCore 反射 :Could not load file or assembly 系统找不到指定文件
“System.IO.FileNotFoundException:“Could not load file or assembly 'ClassLibrary2, Culture=neutral, PublicKeyToken=null'. 系统找不到指定的文件。”” 在 .net 程序开发中我们会经常用到反射,最近在开始慢慢接触 .netCore。Core 反射的语法也是一样的,所以写下来也没有什么问题,但是一运行,就弹出了开头的 异常。 项目结构如下 ClassLibrary3 是一个接口
|
1 2 3 4 5 6 7 |
namespace ClassLibrary3 { public interface IClass1 { void Print(); } } |
ClassLibrary2 是 ClassLibrary3 的实现
|
1 2 3 4 5 6 7 8 9 10 |
namespace ClassLibrary2 { public class Class1:IClass1 { public void Print() { Console.WriteLine("Print....."); } } } |
主程序通过反射获取到到类型并创建对象
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); Assembly assembly = Assembly.Load(new AssemblyName("ClassLibrary2")); Type type = assembly.GetType("ClassLibrary2.Class1"); var instance = (IClass1)Activator.CreateInstance(type); instance.Print(); Console.ReadLine(); } } |
这代码都这里没有问题,但是执行的时候却抛出了 开篇的异常。仔细检查了下,ClassLibrary2 生成的 dll 确认已经是复制到了主程序目录下。 刚开始接触Core 也没有系统去熟悉,最后经过多方努力后,发现在主程序项目下有个 deps.json 的文件 文件内容是这样的(里面没有 ClassLibrary2 因为我们没有在项目中引用 ClassLibrary2) 然后想着 那异常提示找不到路径,那我们在这里配置下不久可以了? 然后改成如下: 这时候我们运行程序: 完美! from:https://www.cnblogs.com/mengtree/p/7139108.html
View DetailsKubernetes(一) 跟着官方文档从零搭建K8S
前言 本文将带领读者一起, 参照着Kubernetes官方文档, 对其安装部署进行讲解. Kubernetes更新迭代很快, 书上、网上等教程可能并不能适用于新版本, 但官方文档能. 阅读这篇文章你能收获到: 如何阅读Kubernetes官方安装指南并搭建一个Kubernetes环境. Kubernetes安装过程中的注意事项. 避过常见的坑. 阅读本文你需要: 熟悉Linux命令. 知道Kubernetes是用来干什么的 (不然装它干啥(ಥ_ಥ)). 知道Docker 器材准备 文档链接: Before you begin 序号 名称 数量 备注 1 服务器 2 操作系统: Linux(centos7, 其它操作系统也可, 安装过程类似, 可参考官方文档) 机器配置: CPU >= 2, 内存 >= 2G 从官网找到kubeadm安装文档入口, 文档很详细. 英文阅读没有障碍的读者推荐直接查看英文文档, 中文文档不全且更新不及时安装时可能存在问题. 前期准备 笔者已经预先安装好了两台虚拟机, centos7(CPUx2, 内存2.5G). 并在路由器上固定了这两个虚拟机的IP地址. 修改hostname
|
1 2 3 |
[root@k8s-master ~]$ vim /etc/hostname # 修改hostname [root@k8s-master ~]$ vim /etc/hosts # 将本机IP指向hostname [root@k8s-master ~]$ reboot -h # 重启(可以做完全部前期准备后再重启) |
修改后, 两台虚拟机的配置如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# in k8s-master [root@k8s-master ~]$ cat /etc/hostname k8s-master [root@k8s-master ~]$ cat /etc/hosts | grep k8s 10.33.30.92 k8s-master 10.33.30.91 k8s-worker # in k8s-worker [root@k8s-worker ~]$ cat /etc/hostname k8s-worker [root@k8s-worker ~]$ cat /etc/hosts | grep k8s 10.33.30.92 k8s-master 10.33.30.91 k8s-worker |
确认MAC和product_uuid的唯一性 文档链接: Verify the MAC address and product_uuid are unique for every node
|
1 2 |
[root@k8s-master ~]$ ifconfig -a # 查看MAC [root@k8s-master ~]$ cat /sys/class/dmi/id/product_uuid # 查看product_uuid |
注: 如果你的centos7没有ifconfig命令, 可以执行yum install net-tools进行安装. 配置防火墙 文档链接: Check required ports 由于是本地内网测试环境, 笔者图方便, 直接关闭了防火墙. 若安全要求较高, 可以参考官方文档放行必要端口.
|
1 2 |
[root@k8s-master ~]$ systemctl stop firewalld # 关闭服务 [root@k8s-master ~]$ systemctl disable firewalld # 禁用服务 |
[…]
View Details