1. 数据类型
var age:number = 10;
export { }
let name: string = "zhufeng";
let married: boolean = true;
let hobbies: string[] = ["1","2"];
let interests: Array<string> = ["4","5"]
let point: [number, number] = [100,200];
let person: [string, number] = ["zhufeng",200];
enum Gender {
BOY,
GIRL
}
console.log(`${Gender.BOY}`);
let Gender2 = {
0: "BOY",
1: "GIRL",
"BOY": 0,
"GIRL": 1
}
enum WEEK {
mondy = 1,
tuesday = 2
}
console.log(WEEK.mondy);
let root: HTMLElement | null= document.getElementById('root');
root!.style.color = 'red';
let myname: string = null;
let x: number;
x = 1;
x = undefined;
x = null;
function greeting(name: string): void{
console.log(`hello ${name}`);
return null
}
greeting("zhufeng")
function createError(message: string): never{
console.log(1);
throw new Error("error")
console.log(2);
}
function sum():never {
while(true){
console.log('hello');
}
console.log('end point');
}
let name4 = 'zhufeng';
let name44 = new String(name4);
name4.toLocaleLowerCase();
let name5: string | number;
name5 = 'zhufeng';
name5.toLocaleLowerCase();
name5 = 5;
name5.toFixed(2);
let name6: string | number;
(name6 as string).toLocaleLowerCase()
type Gender4 = 1 | 'Boy' | 'girl';
let a:Gender4 = 'Boy';
2. 函数
function hello(name: string){
console.log(name);
}
type GetUserNameType = (firstName:string, lastName: string) => {
name: string
}
let getUserName: GetUserNameType = function(firstName:string, lastName: string) : {
name:string
}{
return { name: firstName + lastName}
}
type GetUserNameType1 = (firstName:string, lastName: string) => void
let getUserName1: GetUserNameType1 = function(firstName:string, lastName: string) : void{
}
function print(name:string, age:number, home?:string){
}
print("zhufeng",10)
function ajax(url:string, method: string = 'get'){
console.log(url,method);
}
ajax('/url')
function sum(...numbers: Array<number>){
return numbers.reduce((total, item) => total + item, 0);
}
let obj: any = {};
function attr(val: string):void;
function attr(val: number):void;
function attr(val: any):void{
if(typeof val == 'string'){
obj.name = val
} else if (typeof val == 'number'){
obj.age = val
}
}
attr('zhufeng')
attr(10)
function sum2(a: string, b:number): void;
function sum2(a: number, b:number): void;
function sum2(a:any, b:any): void{
}
sum2("2",3)
3. 类
namespace a{
class Person {
name: string = "zhufeng";
age: number;
constructor(){
this.age = 10;
}
}
let p1 = new Person();
}
namespace b{
class Person {
myname: string = "zhufeng";
constructor(name: string){
this.myname = name;
}
get name(){
return this.myname;
}
set name(newVal: string){
this.myname = newVal.toUpperCase();
}
}
let p = new Person('zhufeng');
p.name = 'jiagou'
}
namespace c {
class Person{
constructor(public readonly name: string){
}
}
let p = new Person("zhufeng")
console.log(99,p.name);
}
namespace d {
class Person {
public name: string;
protected sex: string;
protected age: number;
private amount: number;
constructor(name: string, age: number,sex: string){
this.name = name;
this.age = age;
this.sex = sex;
this.amount = 10;
}
getName(){
return this.name;
}
setName(newName: string){
this.name = newName;
}
}
class Student extends Person{
static type = "student"
stuNo: number;
constructor(name: string, age: number,stuNo: number,sex: string){
super(name,age,sex);
this.stuNo = stuNo;
}
static getType(){
console.log("测试static");
return Student.type
}
getStudentNo(){
return this.stuNo + this.sex ;
}
setStudentNo(newStuNo: number){
this.stuNo = newStuNo;
}
}
let s = new Student("zhufeng", 10, 1,"男00")
console.log(s.name);
console.log(s.sex);
console.log(Student.type);
Student.getType();
}
4. 装饰器
namespace s{
interface Person{
xx: string;
yy: string;
}
function enhancer(target: any){
target.prototype.xx = "大写的XX";
target.prototype.yy = "大写的YY"
}
@enhancer
class Person {
constructor(){
}
}
let p = new Person();
console.log(p.xx);
console.log(p.yy);
}
namespace b{
function enhancer(){
return function enhancer(target: any){
return class extends target {
public name: string = "sss";
public age: number = 10;
}
}
}
@enhancer()
class Person {
public age:number = 10;
public name:string = 'zhufeng';
constructor(){ }
}
let p = new Person();
console.log('000',p.name);
console.log(p.age);
}
namespace c {
function upperCasr(target: any, propertypeName: string) {
let value = target[propertypeName];
const getter = () => value;
const setter = (newVal: string) => {
value = newVal.toUpperCase();
}
delete target[propertypeName]
Object.defineProperty(target, propertypeName, {
get:getter,
set:setter,
enumerable: true,
configurable: true
})
}
function propertyEnumerable(flag: boolean){
return function (target: any, methodName: string){
}
}
function methodEnumerable(flag: boolean){
return function(target: any, methodName: string, propertyDescriptor: PropertyDescriptor){
propertyDescriptor.enumerable = flag;
}
}
function setAge(age: number){
return function(target: any, methodName: string, propertyDescriptor: PropertyDescriptor){
target.age = age
}
}
function toNumber(target: any, methodName: string, propertyDescriptor: PropertyDescriptor){
let oldMethod = propertyDescriptor.value;
propertyDescriptor.value = function (...args:any[]){
args = args.map(item => parseFloat(item))
return oldMethod.apply(this,args)
}
}
class Person {
static age: number;
@upperCasr
@propertyEnumerable(false)
name: string = 'zhufeng'
@methodEnumerable(true)
getName(){
console.log("getName");
}
@setAge(100)
static getAge(){
}
@toNumber
sum(...args: any[]){
return args.reduce((accu, item) => accu + item,0)
}
}
let p = new Person();
p.name = 'jiagou';
console.log(p.name);
for(let attr in p){
console.log('attr=' + attr);
}
console.log(Person.age);
console.log(p.sum(1,'2','3'));
}
namespace d {
interface Person{
age: number
}
function addAge(target: any,methodName:string,paramsIndex: number){
target.age = 12;
}
class Person{
login(username: string, @addAge pwd: string){
console.log(this.age,username,pwd);
}
}
let p = new Person();
p.login("str","123")
}
5. 抽象类
namespace a{
abstract class Animal {
name: string;
abstract getName():string
}
class Cat extends Animal {
getName():string {
return this.name
}
}
let cat = new Cat();
cat.name = "mao";
console.log(cat.getName());
interface Point {
x:number
y:number
}
let point: Point = {x:0, y:0}
interface Speakable {
speak(): void
}
interface Eatable {
eat(): void
}
class Person implements Speakable, Eatable {
speak(){}
eat(){}
}
}
namespace b {
class Animal{
constructor() {
}
speak(){
console.log('动物叫');
}
}
class Cat extends Animal{
speak() {
console.log('///我们一起喵喵喵');
super.speak()
console.log(567);
}
}
let p = new Cat();
p.speak();
class Dog extends Animal{
speak() {
console.log('我们一起汪汪汪');
super.speak()
}
}
let dog = new Dog();
dog.speak();
}
6. super
namespace a{
abstract class Animal {
name: string;
abstract getName():string
}
class Cat extends Animal {
getName():string {
return this.name
}
}
let cat = new Cat();
cat.name = "mao";
console.log(cat.getName());
}
7. 接口 - 任意属性
namespace a {
interface PlainObject {
x:number,
y:number
[propName: string]: number;
}
let obg: PlainObject = {
x: 1,
y: 2,
z: 3
}
interface Speakable {
speak(): void;
}
interface SpeakChinese extends Speakable {
speakChinese() :void
}
class Person implements SpeakChinese {
speak() {}
speakChinese() {}
}
interface Circle{
readonly PI: number;
radius: number
}
let circle:Circle={
PI: 3.14,
radius: 10
}
interface Discount{
(price:number): number
}
let cost: Discount = function (price: number): number {
return price * .8
}
interface UaerInterface {
[index: number]: string
}
let arr: UaerInterface = ['1','2','3']
console.log(arr);
let obj2: UaerInterface = {
1:'1',
2:'2'
}
console.log(99,obj2);
}
namespace b{
interface Speakable {
name?: string,
speak(words: string) :void
}
class Dog implements Speakable{
name:string;
speak() {
console.log('hahah');
}
}
let dogg = new Dog();
dogg.speak()
class Animal {
constructor(public name: string){
console.log(name);
}
}
interface WithNameClass {
new(name: string): Animal
}
function createAnimal(clazz: WithNameClass, name: string){
return new clazz(name)
}
let a = createAnimal(Animal, 'zhufeng')
console.log(a);
interface SquareConfig {
color?: string;
width?: number;
}
function createSquare(config: SquareConfig): {color: string; area: number} {
let newSquare = {color: "white", area: 100};
if (config.color) {
newSquare.color = config.color;
}
if (config.width) {
newSquare.area = config.width * config.width;
}
console.log(config.width * config.width);
return newSquare;
}
let mySquare = createSquare({color: "black"});
console.log(mySquare);
}
8.泛型
namespace a{
function creatArray111(length: number, val: any):Array<any>{
let result: Array<any> = [];
for(let i = 0; i < length; i++){
result[i] = 1;
}
return result;
}
var aa3 = creatArray111(3,3);
console.log(aa3);
function creatArray<T>(length: number, val: T):Array<T>{
let result: Array<T> = [];
for(let i = 0; i < length; i++){
result[i] = val;
}
return result;
}
function create<T>(length: number, val: T): Array<T>{
}
}
setTimeout(()=>{
let result1 = creatArray<number>(3, 3);
console.log(result1);
})
let result2 = creatArray<string>(3, "zhufeng");
console.log(result2);
function sum(...args2: any[]){
let args:IArguments = arguments;
for(let i = 0;i<args.length;i++){
console.log(args[i]);
}
}
sum(1,2,"3")
class MyArray<T>{
private list: T[] = [];
add(val: T){
this.list.push(val)
}
getMax(): T {
let result: T = this.list[0];
for(let i = 0; i < this.list.length; i++){
if(this.list[i] > result) {
result = this.list[i]
}
}
return result;
}
}
let arr = new MyArray<number>();
arr.add(1);
arr.add(2);
arr.add(3);
let result3: number = arr.getMax();
console.log(result3);
interface Calculate {
<T>(a: T,b: T): T
}
let add: Calculate = function <T>(a: T,b: T): T{
return a
}
let result4 = add<number>(5,5)
console.log(result4);
interface Caluclate{
<T>(a: T,b:T): T
}
let addz: Caluclate = function (a,b){
return a
}
let result8 = add<number>(5,5)
console.log(999,result8);
function swap<A, B>(tuple: [A, B]): [B, A]{
return [tuple[1], tuple[0]]
}
let aa = swap<string, number>(["zhufeng",10])
console.log(aa);
function swapz<A, B>(aa:[A,B]): [B,A]{
return [aa[1],aa[0]]
}
let result5 = swapz<string,number>(['zhufeng',40])
console.log(result5);
function creatArray2<T = string>(aa: number): T {
let t: T | null = null;
return t
}
let result6 = creatArray2<number>(3);
console.log(result6);
interface LengthWith {
length: number
}
function logger<T extends LengthWith>(val: T){
console.log(val.length);
}
logger('zhufeng')
interface Cart<T>{
list: T[]
}
let cart: Cart<string> = {
list:['1','2','3']
}
type Cart2<T> = {list: T[]} | T[];
let c1: Cart2<string> = { list: ['1']};
let c2: Cart2<string> = ['1'];
}
9.接口兼容性
namespace a{
interface Animal {
name: string,
age: number
}
interface Calculate {
<T>(a: T,b: T): T
}
interface Person {
name: string,
age: number,
speak: () => void
}
function getName(animal: Animal): string {
return animal.name
}
let q: Animal = {
name: 'zhufeng0',
age: 10,
}
console.log(getName(q));
let p: Person = {
name: 'zhufeng1',
age: 10,
speak() {}
}
console.log(getName(p));
let num: string | number = 1;
let str: string = 'hello';
num = str;
let num2: {
toString(): string
}
let str2: string = 'jiagou';
num2 = str2;
}
namespace b {
class Animal {
name: string
}
class Bird extends Animal {
}
let a: Animal;
a = new Bird();
let b: Bird;
b = new Animal();
b = {name: 'zhufeng'}
}
namespace c {
type sumFunction = (a: number, b: number) => number;
let sum: sumFunction;
function f1(a: number, b: number): number{
return a;
}
sum = f1;
function f2(a: number): number{
return a;
}
sum = f2;
function f3(a: number, b: number,c: number): number{
return a;
}
type GetPerson = () =>{name: string, age: number};
let getPerson: GetPerson;
function g1(){
return {name: 'string', age:10};
}
getPerson = g1;
function g2(){
return {name: 'string'}
}
function g3(){
return {name: 'string', age:10, home:'beijing'};
}
getPerson = g3;
type logFunc = (a: number | string) => void;
let log: logFunc;
function log1(a: number | string | boolean){
console.log(a);
}
log = log1
interface Empty<T> {
}
let x!: Empty<string>;
let y!: Empty<number>;
x = y;
interface Empty1<T> {
data: T
}
let x1!: Empty1<string>;
let y2!: Empty1<number>;
interface Empty1String<T> {
data: string
}
interface Empty1Number<T> {
data: number
}
enum Colors {
Red,Yellow
}
let c:Colors;
c = Colors.Red;
c = 1;
let d: number;
d = Colors.Yellow;
}
10. 类型保护
namespace a{
function double(input: string | number | boolean){
if(typeof input == 'string'){
input.toLowerCase();
}else if(typeof input == 'number'){
input.toFixed(2);
}else{
input
}
}
class Animal{
public name: string = 'zhufeng'
}
class Bird extends Animal{
public swing: number = 2
}
function getName(a: Animal){
if(a instanceof Bird){
a.swing;
}else{
a.name
}
}
function func(s: string | null){
return s!.charAt(0);
}
interface WarningButton {
calss: 'warning',
text1: '修改'
}
interface DangerButton {
calss: 'danger',
text2: '错误'
}
type Button = WarningButton | DangerButton
function getButton(button: Button){
if(button.calss === 'warning'){
button.text1
}else{
button.text2
}
}
interface Bird{
swing: number
}
interface Dog{
leg: number
}
function getNumber(x: Bird | Dog){
if('swing' in x){
x.swing;
}else{
x.leg
}
}
}
namespace b{
interface Bird{
name1: 'Bird'
legs: number
}
interface Dog{
name2: 'Dog'
legs: number
}
function isBird(x: Bird | Dog): x is Bird{
return x.legs === 2;
}
function getAnimal(x: Bird | Dog){
if(isBird(x)){
x.name1;
console.log('ppp',x.name1);
}else{
x.name2;
console.log(x.name2);
}
}
let x: Bird = {name1:'Bird',legs:2}
getAnimal(x)
}
11. 交叉类型
namespace a{
interface Bird{
name: string
fly():void
}
interface Person{
name: string
eat():void
}
type BirdMan = Bird & Person;
let p: BirdMan = {
name: 'Dog',
eat(){},
fly(){}
}
}
namespace b{
let p = {
name: 'zhufeng',
age: 10
}
type Person = typeof p;
let p2: Person = {
name:'zhufeng',
age:20
}
interface Person2 {
name: string;
age: number;
job: {
name: string
},
interests: {name: string; level: number}[]
}
let myname: Person2['job']['name'] = 'fe';
let mylevel: Person2['interests'][0]['level'] = 10
interface Person3{
name: string
age: number,
gender: 'mail' | 'female',
}
type Person3Key = keyof Person3
function getValueByKay(val: Person3, key: Person3Key){
return val[key]
}
let person3: Person3 = {
name: 'zhufeng',
age: 10,
gender: 'mail' ,
}
let name = getValueByKay(person3,'name')
console.log(name);
interface Person4{
name: string
age: number,
gender: 'mail' | 'female',
}
type PartialPerson = {
[key in keyof Person4] ?: Person4[key]
}
let p4: PartialPerson = {
name: 'zhufeng',
age: 10,
}
console.log(p4);
type RequirePerson = Required<Person4>;
let p5: RequirePerson = {
name: 'zhufeng',
age: 10,
gender: 'mail',
}
type ReadonlyPerson = Readonly<Person4>;
let p6: ReadonlyPerson = {
name: 'zhufeng',
age: 10,
gender: 'mail',
}
type PickPerson = Pick<Person4,'name'>
let x: PickPerson = {
name:'name'
}
}
namespace c{
let x = {
name:'name'
}
let a = typeof x;
type b = typeof x;
console.log(a);
console.log(b);
let xx: [string, number] = ['1',2]
console.log(xx[1 ]);
}
12. 命名空间
namespace a{
interface Fish{
name1: string
}
interface Fish2{
name1: string,
age: number
}
interface Water{
name2: string
}
interface Bird{
name3: string
}
interface Sky{
name4: string
}
type Condition<T> = T extends Fish ? Water : Sky;
let condition: Condition<Fish2> = {
name2: 'water'
}
type Condition2<T> = T extends Fish ? Water : Sky;
let c1: Condition2<Fish | Bird> = {name2:'zhufeng'}
let c2: Condition2<Fish | Bird> = {name4:'zhufeng'}
let c3: Water | Sky = {name2:'zhufeng'}
let c4: Water | Sky = {name4:'zhufeng'}
}
namespace c{
type E = Exclude<string | number, string>;
let e: E = 10;
type E2 = Extract<string | number | null, string>
let e2: E2 = 'hello';
type E3 = NonNullable<string | number | null | undefined>;
let e3: E3 = 'hello';
let e4: E3 = 10;
function getUserInfo(){
return {name:'zhufeng', age:10}
}
type UserInfo = ReturnType<typeof getUserInfo>
let user: UserInfo = {
name:'zhufeng',
age:10
}
class Person5{
name: string;
constructor(name: string){
this.name = name;
}
}
type P = InstanceType<typeof Person5>;
let p: P = new Person5('zhufeng')
}
13. 声明文件
$('#name').click()
declare let name1:string;
declare let age: number;
declare function getName() :void;
declare class Animal {name: string}
interface Person6{
name: string
}
type Student = Person6 | string;
declare const enum Seasons{
Spring,
Summer,
Autumn,
Winter
}
let siji: Seasons[] = [
Seasons.Spring,
Seasons.Summer,
Seasons.Autumn,
Seasons.Winter,
]
console.log(siji);