安装
npm init -y
npm i typescript --save-dev
创建文件
function run(name:string,age:number){
console.log(name,age);
}
run("www",12);
运行
./node_modules/.bin/tsc demo01/first.ts
生成first.js
function run(name, age) {
console.log(name, age);
}
run("www", 12);
运行
./node_modules/.bin/tsc -d demo01/first.ts
多生成一个first.d.ts
declare function run(name: string, age: number): void;
基础类型
//基础类型写法
let str:string = "wss";
let num:number = 123;
let bool:boolean = true;
let age = 12;
let str2:String = "leo";//字符串类类型
let str3:string = new String("wss");//error
let nul:null = undefined;
let und:undefined = null;
//数组
let arr:number[] = [];
// arr.push("str");error
let arr2:Array<string> = ["leo",undefined,"wws"];
// 元组
let tuple:[string,number] = ["wss",123];
tuple[2] = 111;
tuple[5]="ee";
// 为其他赋值只能是 string或number。
enum T2{
A = "aaa",
A2 = "ccc"
}
enum T3{
A = 2,
B,//会自动加1 3
C//4
}
返回值
// any 任何类型
// void 什么都没有
function abc():void{
return ;
// return undefined;
// return null;
}
function dfg():any{
return 123;
// return "qw";
// return undefined;...
}
never 用法
//never
function err(msg:string):never{
throw new Error(msg);
}
function run(name:string){
if(name.length > 10){
error("名字太长");
}
}
类
//权限级别的修饰符
class User{
//比js多一个定义属性 以及权限的修饰符
private name:string;//只有自身可以访问
// public age:number;
public readonly age:number;//只读不可写
protected group:string;//自身可以方问,以及子类可以访问
constructor(name:string,age:number){
this.name = name;
this.age = age;
this.group = "hhh";
}
private changename(){
}
}
class People extends User{
constructor(){
super("default name",18);
console.log(this.group);//子类可访问 受保护对象
}
}
var user = new User("wss",18);
// user.name = 会出错,private为私有
// user.group error
export {User};
修饰器
//修饰器
function classD(target){
console.log(target);//fuction:User
target.prototype.abc = function(){
console.log("abc");
}
}
@classD
class User{
}
var u:any = new User();
u.abc();
export {}//形成模块的封装
tsconfig.json增加
"experimentalDecorators":true
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "dist",
"noEmitOnError":true,
"sourceMap": true,
"declaration":false,
"experimentalDecorators":true
},
"include": [
"src/**/*"
],
"exclude":[
"node_modules"
]
}
//方法修饰
function ppp(prototype:any,methodName:string,des:PropertyDescription){
console.log(arguments);
// 0:User{}
// 1:abc
// 2:{
// value:[function:abc]
// writable:true
// enumerable:false
// configurable:true
// }
des.writable = false;//更改后,方法不能被更改。不会打印 222
}
class User{
@ppp
abc(){
console.log("111");
}
}
var user = new User();
user.abc = function(){
console.log("222");
}
// abc被改,打印222
//属性修饰
function ppp(prototype:any,propname:string){
console.log(arguments);
// 0:User{}
// 1:name
if(!prototype.porpList){
prototype.porpList = [];
}
prototype.propList.push(propname);
}
// function addPropList(target){
// target.prototype.propList = [];
// }
@addPropList
class User{
@ppp
private name:string;
@ppp
age:number;
@ppp
groutp:any;
print(){
let self:any = this;//转为any后,可以调用任意属性不会报错
console.log(self.porpList);
}
}
var u = new User();
u.print();
export{}
npm run build后
node ***.js
// 方法形参修饰器
//
// prototype 原型对象
// methodName 方法名
// index 参数索引位置
//属性修饰
function ppp(prototype:any,propname:string){
console.log(arguments);
// 0:User{}
// 1:name
if(!prototype.porpList){
prototype.porpList = [];
}
prototype.propList.push(propname);
}
//方法形参候饰器
function argv(proto:any,methodName:string,index:number){
console.log(arguments);
// 0:User{propList:[name,age,group]},
// 1:myfun
// 2:1
if(!proto.methodArgMap){
proto.methodArgMap = {};
}
let map;
if(!proto.methodArgMap[methodName]){
proto.methodArgMap[methodName] = [];
}
map = proto.methodArgMap[methodName];
}
@addPropList
class User{
@ppp
private name:string;
@ppp
age:number;
@ppp
groutp:any;
print(){
let self:any = this;//转为any后,可以调用任意属性不会报错
console.log(self.porpList);
}
myfun(a:string,@argv b:number){
}
}
var u:any = new User();
u.print();
console.log(u.methodArgMap);
export{}