Herramientas de usuario

Herramientas del sitio


wiki2:new_typescript

¡Esta es una revisión vieja del documento!


TypeScript

/*
Inicializar un paquete:
npm init -y
Añadir el compilador typescript
npm add -s typescript
Ejecutar el compilador typescript
npx tsc
Inicializar projecto typescript con codigo en src y salida en lib
npx tsc --init --rootdir src --outdir lib
Ahora la ejecución compila el codigo
npx tsc
Dejarlo compilando
npx tsc --watch
*/
 
let message: string = "Hello world";
console.log(message);
 
/*
"use strict";
let message = "Hello world";
console.log(message);
*/
 
//-- Primitives
let isPresent: boolean = true;
let beast: number = 66.4566;
let anotherNumber: string = beast.toPrecision(1); 
let notDefined: undefined = undefined;
let notPresent: null = null;
 
let penta: symbol = Symbol('star');
let biggy: bigint = 9007199254740991n;
 
//-- List classes
let array: Array<number> = [1, 2, 3];  
let array2: number[] = [1, 2, 3];
let set: Set<number> = new Set([1, 2, 3]);
 
//-- Generics
class Queue<T> {
    private data: Array<T> = [];
    push(item: T) { this.data.push(item); }
    pop(): T | undefined { return this.data.shift(); }
}
let queue: Queue<number> = new Queue();
queue.push(33);
 
//-- Tuples
let tuple: [number, number] = [0, 0]; // [0, 0, 0] is an error
 
//-- Types and type alias
let center: {x: number, y: number} = {
    x: 0, y: 0
};
 
type Point = {x: number, y: number};
let center2: Point = {x: 0, y: 0};
 
//-- Functions
function add(a: number, b: number): number { return a + b; }
function log(message: string): void { console.log(message); }
function sum(...values: number[]) {}
 
let addFunction: (a: number, b: number) => number;
addFunction = add;
 
//-- Structural typing
type User = { id: string };
type Product = { id: string };
 
let user: User = { id: "1" };
let product: Product = { id: "3" } ;
let user2: User = product; // No error
 
type Point2D = { x: number, y: number };
type Point3D = { x: number, y: number, z: number};
let p2: Point2D = { x: 0, y: 0 };
let p3: Point3D = { x: 1, y: 1, z: 1 };
p2 = p3; // No error. p3 = p2 <- error
function takePoint2D (point: Point2D) {}
takePoint2D(p3);
 
//-- Classes
class Animal {
    private name: string;
    protected position: number;
    #last_name: string;  // This is also private, but `private` is prefered
    constructor(name: string) {
        this.name = name;
        this.position = 0;
        this.#last_name = "Toby";
    }
    public move(meters: number): void { this.position += meters; }
}
class Bird extends Animal {  // Having private position would not work
    fly (miles: number): void { this.position += (miles * 0.0006); }
}
let cat = new Animal("cat");
cat.move(10);
 
//-- Any and Unknown
let exampleAny: any = 333;
let exampleUnknown: unknown = 333;  // safer
 
exampleAny.allow.anything();
let bBoolean: boolean = exampleAny;
 
// exampleUnknown.does.not.allow();
// exampleUnknown.trim(); // does not allow this either
if (typeof exampleUnknown == 'string') { exampleUnknown.trim() }
 
//-- Type assertion and casts
import { load } from "./test.js"  // we require to "allowJS" in tsconfig.json
let varLoaded = load();
const trimmed: string = (varLoaded as string); // assertion
let strVariable: string = "1992";
let numVariable: number = +strVariable; // cast
let bVariable: boolean = (numVariable == 1992);
 
/*
 
When you want to use an external variable, like process.env from node. We will do a declaration:
declare const process: any;
There is a way to directly define those external variables in a non invasive way:
- You can set them in `env.d.ts` file.
But if you are going to use node typing, the best way is to install the `@types/node` package.
With this, it is not required to import those variables.
For example, with Express.js: `@types/express`
 
However, for using TypeScript on node we will make use of ts-node package.
 
JS:
If you create this class:
class Person {
    growOld() { this.whatever } 
}
And you use a person instance with: const growOld = person.growOld(), `this` is lost.
For maintaining the `this` context growOld must be defined like this:
class Person {
    growOld = () => { this.whatever } 
}
*/
 
//-- Readonly
type XValue = {
    readonly x: number;
}
let xvalue: XValue = {x: 33}
// xvalue.x = 33; this gives an error
 
//-- Unions
function format(input: string | string[]) : void {} // Accepts string or string array
 
//-- Literals
let direction: 'North' | "South" | "East" | "West";
direction = 'North';
// direction = 'north'; error
 
class Cat { meow() {}}
class Dog { bark() {}}
type Pet = Cat | Dog;
let pet: Pet = new Cat()
if (pet instanceof Cat) pet.meow();
 
//-- Discrimination
 
type Circle = {
    kind: 'circle',  //This can be a boolean. The real example is with isValid: true, and then isValid: False
    validatedValue: string,
};
 
type Square = {
    kind: 'rectangle',
    errorReason: string,
};
 
type Figure =
    | Circle
    | Square;
 
function logResult(result: Figure) {
    if (result.kind == 'circle') {
        console.log('Success, validated value:', result.validatedValue);
    }
    if (result.kind == 'rectangle') {
        console.error('Failure, error reason:', result.errorReason);
    }
}
 
//-- parameter properties
class Person {
    constructor (public name: string, public age: number) {}
}
const adam = new Person('Adam', 12000);
console.log(adam.name); // Prints Adam
 
//-- Intersection types
 
type Another2D = {
    x: number,
    y: number
}
 
type Another3D = Another2D & {
    z: number
}
 
let aP3D = {x: 2, y: 3, z: 4}
 
type AnotherPerson = { name: string }
type Email = { email: string}
function contact(data: AnotherPerson & Email) {}
contact({name: "hola", email: "a@b.com"})
type ContactData = AnotherPerson & Email;
function contact2(data: ContactData) {}
 
//-- Optionals
 
type APerson = {name: string, email: string, phone?: string };
const alfred: APerson = {name: "alfred", email: "a@a.com"}
 
//-- Not null
 
type Position = {x: number, y?: number | null | undefined}
let p: Position = {x: 33}
console.log(p.y!)
 
//-- Interfaces 
 
interface Location2D  {
    x: number,
    y: number
}
 
interface Location2D {  // this is merged
    xy: string
}
 
interface Location3D extends Location2D {
    z: number
}
 
let location: Location3D = {x: 0, y: 0, z: 0, xy: "00"}
 
//-- never
let example: never;
// ----
type Square1 = {
    kind: 'square',
    size: number,
  };
 
  type Rectangle1 = {
    kind: 'rectangle',
    width: number,
    height: number,
  };
 
  type Circle1 = {
    kind: 'circle',
    radius: number,
  };
 
  type Shape1 =
    | Square1
    | Rectangle1
    | Circle1;
 
  function area(s: Shape1) {
    if (s.kind === 'square') {
      return s.size * s.size;
    } else if (s.kind === 'rectangle') {
      return s.width * s.height;
    } else if (s.kind === 'circle') {
      return Math.PI * (s.radius ** 2);
    } 
    const _ensureAllCasesAreHandled: never = s;  // this is an assert. It will raise a TS error if we do not handle a type
    return _ensureAllCasesAreHandled;
  }
wiki2/new_typescript.1667391204.txt.gz · Última modificación: 2022/11/02 13:13 (editor externo)