नोट: इस सरल और 2017/04/13 अद्यतन टाइपप्रति 2.1 प्रतिबिंबित करने के लिए किया गया था, टाइपप्रति 1.8 जवाब के लिए इतिहास को देखते हैं।
ऐसा लगता है कि आप वस्तु पैरामीटर वैकल्पिक होना चाहता हूँ, और यह भी वस्तु में संपत्तियों में से प्रत्येक वैकल्पिक किया जाना है। उदाहरण में, के रूप में प्रदान की है, अधिभार वाक्य रचना की जरूरत नहीं है। मैं जवाब यहां से कुछ में कुछ बुरी प्रथाएँ करना चाहता था। दी, यह अनिवार्य रूप से लिखने की छोटी संभव अभिव्यक्ति नहीं है box = { x: 0, y: 87, width: 4, height: 0 }, लेकिन यह सब कोड इशारा ब्योरा के रूप में वर्णित आप संभवतः वर्ग से चाहते सकता है प्रदान करता है। यह उदाहरण आपको एक, कुछ, सब, के साथ एक समारोह कॉल करने के लिए अनुमति देता है या कोई भी मानकों के हैं और अभी भी मूलभूत मूल्यों मिलता है।
/** @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;
}
}
यह एक बहुत ही सुरक्षित तरीका मापदंडों वस्तु परिभाषित के सभी गुण नहीं हो सकता है कि के लिए लिखने के लिए है। अब आप सुरक्षित रूप से इनमें से किसी भी लिख सकते हैं:
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});
संकलित, आप देखते हैं कि वैकल्पिक पैरामीटर सही मायने में वैकल्पिक हैं, कि (लेकिन त्रुटियों की संभावना) एक व्यापक रूप से इस्तेमाल के नुकसान से बचा जाता है वापस आने की वाक्य रचना var = isOptional || default;के खिलाफ जाँच करके void 0, जो के लिए आशुलिपि है undefined:
संकलित आउटपुट
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;
}());
परिशिष्ट: मूलभूत मूल्यों की स्थापना: गलत तरीके से
||(या) ऑपरेटर
के खतरे पर विचार करें ||जब डिफ़ॉल्ट फ़ॉलबैक मान सेट के रूप में कुछ अन्य उत्तर में दिखाया गया है / या ऑपरेटरों। नीचे इस कोड को डिफ़ॉल्ट सेट करने गलत तरीके से दिखाता है। जब के खिलाफ का मूल्यांकन आप अप्रत्याशित परिणाम प्राप्त कर सकते हैं falsey 0 की तरह मान, ', अशक्त, अपरिभाषित, झूठे, 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 (यह, obj)
मेरी परीक्षण, ES6 / टाइपप्रति destructured वस्तु का उपयोग करने में लगभग 90% Object.assign तुलना में तेजी से हो सकता है । एक destructured पैरामीटर का उपयोग केवल अनुमति देता है तरीकों और गुण आप वस्तु को निर्दिष्ट किए गए। उदाहरण के लिए, इस विधि पर विचार करें:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
किसी अन्य उपयोगकर्ता टाइपप्रति का उपयोग नहीं किया गया था और कोशिश की एक पैरामीटर है कि संबंधित नहीं थे, जगह कहते हैं, वे एक डाल की कोशिश कर सकते zसंपत्ति
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')