Not: Bu basitleştirilmiş ve typescript 2.1 yansıtacak şekilde 4/13/2017 güncellendi, typescript 1.8 yanıt için geçmişini görmek.
Eğer nesne parametresi isteğe olmak istiyorum gibi geliyor ve aynı zamanda nesnenin özelliklerin her biri isteğe bağlı olarak. Örnek olarak, belirtildiği gibi, aşırı yük söz dizimi gerekli değildir. Burada bazı yanıtlar bazı kötü uygulamalara işaret etmek istedik. Verilmiş, esasen yazı mümkün olan en küçük ifadesi değil box = { x: 0, y: 87, width: 4, height: 0 }, ama bu anlatıldığı gibi belki sınıftan tercih edebilir tüm Kod ipucu incelikler içerir. Bu örnek, biri kısmı, tümü ile bir işlevi çağırmak için izin verir veya parametrelerin hiçbiri hala varsayılan değerler olsun.
/** @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;
}
}
Bu tanımlanmış nesnenin tüm özelliklerine sahip olmayabilir parametreler için yazmaya çok güvenli bir yoldur. Artık güvenle Bunlardan herhangi yazabilirsiniz:
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});
Derleyen, isteğe bağlı parametreler gerçekten yaygın olarak kullanılan eksikliklerini artık (ama hata eğilimli) ait yedek sözdizimi ondan, isteğe olduğunu görüyoruz var = isOptional || default;karşı denetleyerek void 0için kısaltmadır, undefined:
Derleyen Çıktı
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;
}());
Zeyilname: Varsayılan değerleri ayarlanıyor: yanlış yol
||(Ya da) operatör
Tehlikesini düşünün ||diğer bazı cevaplar gösterildiği gibi, varsayılan yedek değerleri belirlerken / veya operatörleri. Bu kod aşağıda varsayılan ayarlamak için yanlış bir şekilde göstermektedir. Karşı değerlendirirken, beklenmeyen sonuçlar elde edebilirsiniz Falsey 0 gibi değerler '', null, tanımsız, yanlış, 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 (bu, obj)
ES6 / typescript Bozunmamış nesneyi kullanarak testlerde, içinde Object.assign daha neredeyse% 90 daha hızlı olabilir . Da tahrip edilen parametreyi kullanmak sadece nesneye atadığınız yöntemleri ve özellikleri sağlar. Örneğin, bu yöntemi göz önünde bulundurun:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Başka bir kullanıcı, ait değildi bir parametre yerleştirmek için typescript kullanarak ve teşebbüs değildi Eğer diyelim ki, onlar koyarak deneyebilirsiniz zözelliği
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')