Constructor túlterhelés géppel

szavazat
216

Van bárki végzett kivitelező túlterhelése géppel. 64. oldalon a nyelv leírás (v 0.8), vannak olyan nyilatkozatok leíró kivitelező túlterhelés, de nem volt olyan minta kódot adott.

Próbálok ki igazán az alap osztály deklarációja most; ez így néz ki,

interface IBox {    
    x : number;
    y : number;
    height : number;
    width : number;
}

class Box {
    public x: number;
    public y: number;
    public height: number;
    public width: number;

    constructor(obj: IBox) {    
        this.x = obj.x;
        this.y = obj.y;
        this.height = obj.height;
        this.width = obj.width;
    }   

    constructor() {
        this.x = 0;
        this.y = 0;
        this.width = 0;
        this.height = 0;
    }
}

Amikor futott a TSC BoxSample.ts, akkor dob ki egy példányban kivitelező meghatározás - ami nyilvánvaló. Minden segítséget értékelik.

A kérdést 03/10/2012 06:48
a forrás felhasználó
Más nyelveken...                            


13 válasz

szavazat
190

Géppel lehetővé teszi, hogy állapítsa meg a túlterhelés, de akkor csak egy végrehajtásáról és a végrehajtáshoz kell egy aláírás, amely kompatibilis az összes túlterhelés. A példád, ez könnyen elvégezhető egy opcionális paraméter, mint az,

interface IBox {    
    x : number;
    y : number;
    height : number;
    width : number;
}

class Box {
    public x: number;
    public y: number;
    public height: number;
    public width: number;

    constructor(obj?: IBox) {    
        this.x = obj && obj.x || 0
        this.y = obj && obj.y || 0
        this.height = obj && obj.height || 0
        this.width = obj && obj.width || 0;
    }   
}

vagy két túlterhelések egy általánosabb kivitelező mint,

interface IBox {    
    x : number;
    y : number;
    height : number;
    width : number;
}

class Box {
    public x: number;
    public y: number;
    public height: number;
    public width: number;

    constructor();
    constructor(obj: IBox); 
    constructor(obj?: any) {    
        this.x = obj && obj.x || 0
        this.y = obj && obj.y || 0
        this.height = obj && obj.height || 0
        this.width = obj && obj.width || 0;
    }   
}
Válaszolt 03/10/2012 07:14
a forrás felhasználó

szavazat
63

Vegye figyelembe, hogy akkor is megoldható a hiánya túlterhelés a végrehajtás szintjén keresztül alapértelmezett paraméterekkel géppel, például:

interface IBox {    
    x : number;
    y : number;
    height : number;
    width : number;
}

class Box {
    public x: number;
    public y: number;
    public height: number;
    public width: number;

    constructor(obj : IBox = {x:0,y:0, height:0, width:0}) {    
        this.x = obj.x;
        this.y = obj.y;
        this.height = obj.height;
        this.width = obj.width;
    }   
}

Edit: Mivel a december 5 '16 lásd Benson válasza egy bonyolultabb megoldás, amely lehetővé teszi a nagyobb rugalmasságot.

Válaszolt 09/10/2012 07:29
a forrás felhasználó

szavazat
48

Ami kivitelező túlterheli az egyik alternatíva az lenne, hogy megvalósuljon a túlterhelés, mint a statikus gyári módszerekkel . Azt hiszem, hogy olvashatóbb és kevésbé zavaró, mint a tesztelés hívás érveket. Itt egy egyszerű példa:

class Person {
    static fromData(data: PersonData) {
        let { first, last, birthday, gender = 'M' } = data 
        return new this(
            `${last}, ${first}`,
            calculateAge(birthday),
            gender
        )
    }

    constructor(
        public fullName: string,
        public age: number,
        public gender: 'M' | 'F'
    ) {}
}

interface PersonData {
    first: string
    last: string
    birthday: string
    gender?: 'M' | 'F'
}


let personA = new Person('Doe, John', 31, 'M')
let personB = Person.fromData({
    first: 'John',
    last: 'Doe',
    birthday: '10-09-1986'
})

Módszer túlterhelés géppel nem az igazi , mondjuk, hiszen ez is túl sok fordító által generált kódot, és a core csapat próbálja elkerülni, hogy minden áron. Jelenleg a fő oka a módszer túlterhelés jelen lenni a nyelv hogy olyan módon, hogy írjon nyilatkozatok könyvtárak mágikus érveket az API-t. Mivel meg kell tennie a nehéz-emelő egyedül kezelni a különböző készletek érvek nem látok sok előnye a túlterhelés helyett elválasztott módszerekkel.

Válaszolt 31/07/2016 21:08
a forrás felhasználó

szavazat
38

Megjegyzés: ez az egyszerűsített és frissített 2017/04/13 tükrözik géppel 2.1, lásd előzmények géppel 1,8 választ.

Úgy hangzik, mintha az objektum paraméter opcionális, továbbá az egyes tulajdonságait a tárgy kötelező. A példában előírt, túlterhelés szintaxis nincs szükség. Azt akartam rámutatni néhány rossz gyakorlat a néhány választ itt. Nyújtott, ez nem a lehető legkisebb kifejezése alapvetően írásban box = { x: 0, y: 87, width: 4, height: 0 }, de ez biztosítja az összes kódot hint apróságokra, amit esetleg szeretne az osztály leírtak. Ez a példa lehetővé teszi, hogy hívja a funkciót egy, több, az összes, vagy sem a paraméterek, és még mindig az alapértelmezett értékeket.

 /** @class */
 class Box {
     public x?: number;
     public y?: number;
     public height?: number;
     public width?: number;     

     // The class can work double-duty as the interface here since they are identical
     // Alternately, reference your own interface, e.g.:  `...BoxI = {} as BoxI` 
     constructor(obj: Box = {} as Box) {

         // Define the properties of the incoming `obj` object here. 
         // Setting a default value with the `= 0` syntax is optional for each parameter
         let {
             x = 0,
             y = 0,
             height = 0,
             width = 0
         } = obj;

         /** Use jsdoc comments here for inline ide auto-documentation */
         this.x = x;
         this.y = y;
         this.height = height;
         this.width = width;
     }
 }

Ez egy nagyon biztonságos módja, hogy írjon paraméterek nem lehet az összes objektum tulajdonságait meghatározni. Most már biztonságosan levelet ezek bármelyikét:

const box1 = new Box();
const box2 = new Box({});
const box3 = new Box({x:0});
const box4 = new Box({x:0, height:10});
const box5 = new Box({x:0, y:87,width:4,height:0});

 // Correctly reports error in TypeScript, and in js, box6.z is undefined
const box6 = new Box({z:0});  

Összeállította, akkor láthatjuk, hogy a választható paraméterek valóban nem kötelező, hogy elkerüli a buktatókat egy széles körben használt (de hibalehetőséget) üzemszüneti szintaxis var = isOptional || default;ellenőrzésével szemben void 0, amely a rövidítés undefined:

Az összeállított kimenet

var Box = (function () {
    function Box(obj) {
        if (obj === void 0) { obj = {}; }
        var _a = obj.x, 
        x = _a === void 0 ? 1 : _a,
        _b = obj.y,
        y = _b === void 0 ? 1 : _b,
        _c = obj.height,
        height = _c === void 0 ? 1 : _c,
        _d = obj.width,
        width = _d === void 0 ? 1 : _d;
        this.x = x;
        this.y = y;
        this.height = height;
        this.width = width;
    }
    return Box;
}());

Kiegészítés: Beállítás alapértelmezett értékek: a rossz irányba

A ||(vagy) operátor

Tekintsük a veszélye ||/ vagy a gazdasági szereplők, amikor beállítja az alapértelmezett értékek visszaesett, ahogy néhány más válaszokat. Ez a kód szemlélteti a rossz út alapbeállításokat. Akkor nem várt eredmények értékelésekor ellen falsey értékek, mint 0, „”, null, meghatározatlan, hamis, NaN:

var myDesiredValue = 0;
var result = myDesiredValue || 2;

// This test will correctly report a problem with this setup.
console.assert(myDesiredValue === result && result === 0, 'Result should equal myDesiredValue. ' + myDesiredValue + ' does not equal ' + result);

Object.assign (e, obj)

Az én tesztek segítségével ES6 / géppel elbontott objektum lehet majdnem 90% -kal gyorsabb, mint a Object.assign . Egy bomlasztott paraméter csak lehetővé teszi a módszerek és tulajdonságok, amit rendelt az objektumot. Vegyük például ezt a módszert:

class BoxTest {
    public x?: number = 1;

    constructor(obj: BoxTest = {} as BoxTest) {
        Object.assign(this, obj);
    }
}

Ha egy másik felhasználó nem az írógéppel és megpróbáltuk a paraméter, amely nem tartozik, mondjuk, lehet, hogy megpróbálják amivel egy ztulajdonság

var box = new BoxTest({x: 0, y: 87, width: 4, height: 0, z: 7});

// This test will correctly report an error with this setup. `z` was defined even though `z` is not an allowed property of obj.
console.assert(typeof box.z === 'undefined')
Válaszolt 05/12/2016 14:30
a forrás felhasználó

szavazat
32

Tudom, hogy ez egy régi kérdés, de új 1.4 unió típusok; használja ezeket az összes funkció túlterhelés (beleértve a konstruktőrök). Példa:

class foo {
    private _name: any;
    constructor(name: string | number) {
        this._name = name;
    }
}
var f1 = new foo("bar");
var f2 = new foo(1);
Válaszolt 04/02/2015 18:28
a forrás felhasználó

szavazat
20

Frissítés (jún 8, 2017): guyarad és snolflake hogy érvényes pontokat észrevételeiket alábbi választ. Azt ajánlom az olvasók nézd meg a válaszokat Benson , Joe és snolflake akik jobb választ, mint az enyém.

Eredeti Válasz (január 27, 2014)

Egy másik példa arra, hogyan érhető kivitelező túlterhelés:

class DateHour {

  private date: Date;
  private relativeHour: number;

  constructor(year: number, month: number, day: number, relativeHour: number);
  constructor(date: Date, relativeHour: number);
  constructor(dateOrYear: any, monthOrRelativeHour: number, day?: number, relativeHour?: number) {
    if (typeof dateOrYear === "number") {
      this.date = new Date(dateOrYear, monthOrRelativeHour, day);
      this.relativeHour = relativeHour;
    } else {
      var date = <Date> dateOrYear;
      this.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
      this.relativeHour = monthOrRelativeHour;
    }
  }
}

Forrás: http://mimosite.com/blog/post/2013/04/08/Overloading-in-TypeScript

Válaszolt 27/01/2014 17:02
a forrás felhasználó

szavazat
3

Abban az esetben, ha egy opcionális, gépelt paraméter elég jó, ötletképpen amely ugyanazt megismétlése nélkül tulajdonságokat vagy meghatároz egy felületet:

export class Track {
   public title: string;
   public artist: string;
   public lyrics: string;

   constructor(track?: Track) {
     Object.assign(this, track);
   }
}

Ne feledje, ez kiosztja az összes tulajdonságait telt el track, eve, ha ők nem definiált Track.

Válaszolt 06/11/2016 00:22
a forrás felhasználó

szavazat
1

Meg tudja kezelni ezt:

import { assign } from 'lodash'; // if you don't have lodash use Object.assign
class Box {
    x: number;
    y: number;
    height: number;
    width: number;
    constructor(obj: Partial<Box> = {}) {    
         assign(this, obj);
    }
}

Részleges teszi a mezők (x, y, magasság, szélesség) adott esetben alkalmazható, amely lehetővé teszi több konstruktőrök

pl: meg tudod csinálni new Box({x,y})anélkül, magasság és a szélesség.

A = {}kezeli falsy érték, mint a meghatározatlan, null, stb, és akkor meg tudod csinálninew Box()

Válaszolt 11/09/2018 09:36
a forrás felhasználó

szavazat
1

Egy másik verzió, mint a @ ShinNoNoir kódját, az alapértelmezett értékek és terjedését szintaxis:

class Box {
    public x: number;
    public y: number;
    public height: number;
    public width: number;

    constructor({x, y, height, width}: IBox = { x: 0, y: 0, height: 0, width: 0 }) {
        this.x = x;
        this.y = y;
        this.height = height;
        this.width = width;
    }
}
Válaszolt 30/11/2016 05:11
a forrás felhasználó

szavazat
0

Én a következő alternatív kap alapértelmezett / választható params és a „fajta-of-túlterhelt” konstruktőrök változó számú paramétereket:

private x?: number;
private y?: number;

constructor({x = 10, y}: {x?: number, y?: number}) {
 this.x = x;
 this.y = y;
}

Tudom, hogy ez nem a legszebb kód elveszett, de az egyik hozzászokik azt. Nincs szükség további felület és ez lehetővé teszi saját tagjai, ami nem lehetséges, ha a felület.

Válaszolt 20/09/2019 14:28
a forrás felhasználó

szavazat
0

Valójában lehet, hogy túl késő ezt a választ, de akkor most ezt:

class Box {
    public x: number;
    public y: number;
    public height: number;
    public width: number;

    constructor();
    constructor(obj: IBox);
    constructor(obj?: IBox) {    
        this.x = !obj ? 0 : obj.x;
        this.y = !obj ? 0 : obj.y;
        this.height = !obj ? 0 : obj.height;
        this.width = !obj ? 0 : obj.width;
    }
}

így ahelyett, hogy a statikus módszer, amit tehetünk a fenti. Remélem ez segít !!!

Válaszolt 26/05/2019 23:31
a forrás felhasználó

szavazat
0

Mi lehet szimulálni kivitelező túlterhelés alkalmazásával őrök

interface IUser {
  name: string;
  lastName: string;
}

interface IUserRaw {
  UserName: string;
  UserLastName: string;
}

function isUserRaw(user): user is IUserRaw {
  return !!(user.UserName && user.UserLastName);
}

class User {
  name: string;
  lastName: string;

  constructor(data: IUser | IUserRaw) {
    if (isUserRaw(data)) {
      this.name = data.UserName;
      this.lastName = data.UserLastName;
    } else {
      this.name = data.name;
      this.lastName = data.lastName;
    }
  }
}

const user  = new User({ name: "Jhon", lastName: "Doe" })
const user2 = new User({ UserName: "Jhon", UserLastName: "Doe" })
Válaszolt 27/03/2019 00:18
a forrás felhasználó

szavazat
0

Meg kell gondolt, hogy ...

contructor ()

kivitelező (a: bármely, b: bármely, c: bármely)

Ez ugyanaz a

új () vagy új ( "a", "b", "c")

És így

kivitelező (a?: bármely, b?: bármely, c?: bármely) azonos a fenti, és rugalmasabb ...

új () vagy új ( "a") vagy új ( "a", "b"), vagy az új ( "a", "b", "c")

Válaszolt 02/06/2018 14:15
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more