এদিকে এটি ডেকরেটারের সাথে সমাধান করা যেতে পারে Object.freezeবা এর সাথে একত্রে Object.defineProperty, আমি এটি ব্যবহার করছি, এটি টন গেটার ব্যবহারের চেয়ে খানিকটা সুন্দর। আপনি এটি সরাসরি টিএস প্লেগ্রাউন্ডটিকে কার্যত দেখতে কপি / পেস্ট করতে পারেন। - দুটি বিকল্প আছে
স্বতন্ত্র ক্ষেত্রগুলিকে "চূড়ান্ত" করুন
নীচের সাজসজ্জাটি বিশৃঙ্খল স্থিতিশীল এবং অ-স্থির ক্ষেত্র উভয়কে "গিটার-কেবল-বৈশিষ্ট্যগুলিতে" রূপান্তর করে।
দ্রষ্টব্য : যদি কোনও প্রাথমিক মানবিহীন কোনও উদাহরণ-পরিবর্তনশীল টীকাযুক্ত করা হয় @final, তবে প্রথম নির্ধারিত মান (কখনই নয়) চূড়ান্ত হবে।
// example
class MyClass {
@final
public finalProp: string = "You shall not change me!";
@final
public static FINAL_FIELD: number = 75;
public static NON_FINAL: string = "I am not final."
}
var myInstance: MyClass = new MyClass();
myInstance.finalProp = "Was I changed?";
MyClass.FINAL_FIELD = 123;
MyClass.NON_FINAL = "I was changed.";
console.log(myInstance.finalProp); // => You shall not change me!
console.log(MyClass.FINAL_FIELD); // => 75
console.log(MyClass.NON_FINAL); // => I was changed.
সাজসজ্জা: নিশ্চিত করুন যে আপনি এটি আপনার কোডে অন্তর্ভুক্ত করেছেন!
/**
* Turns static and non-static fields into getter-only, and therefor renders them "final".
* To use simply annotate the static or non-static field with: @final
*/
function final(target: any, propertyKey: string) {
const value: any = target[propertyKey];
// if it currently has no value, then wait for the first setter-call
// usually the case with non-static fields
if (!value) {
Object.defineProperty(target, propertyKey, {
set: function (value: any) {
Object.defineProperty(this, propertyKey, {
get: function () {
return value;
},
enumerable: true,
configurable: false
});
},
enumerable: true,
configurable: true
});
} else { // else, set it immediatly
Object.defineProperty(target, propertyKey, {
get: function () {
return value;
},
enumerable: true
});
}
}
উপরের সাজসজ্জার বিকল্প হিসাবে, এর একটি কঠোর সংস্করণও থাকবে, যা কেউ "use strict";সেট হওয়ার সাথে ক্ষেত্রটির জন্য কিছু মান নির্ধারণ করার চেষ্টা করলে এমন একটি ত্রুটি এমনকি ছুঁড়ে ফেলবে । (যদিও এটি কেবল স্থির অংশ)
/**
* Turns static fields into getter-only, and therefor renders them "final".
* Also throws an error in strict mode if the value is tried to be touched.
* To use simply annotate the static field with: @strictFinal
*/
function strictFinal(target: any, propertyKey: string) {
Object.defineProperty(target, propertyKey, {
value: target[propertyKey],
writable: false,
enumerable: true
});
}
প্রতিটি স্থির ক্ষেত্রকে "চূড়ান্ত" করুন
সম্ভাব্য ডাউনসাইড: এটি কেবল সেই শ্রেণীর সমস্ত স্ট্যাটিক্সের জন্য বা কোনওটির জন্যই কাজ করবে না, তবে নির্দিষ্ট স্ট্যাটিকগুলিতে প্রয়োগ করা যাবে না।
/**
* Freezes the annotated class, making every static 'final'.
* Usage:
* @StaticsFinal
* class MyClass {
* public static SOME_STATIC: string = "SOME_STATIC";
* //...
* }
*/
function StaticsFinal(target: any) {
Object.freeze(target);
}
// Usage here
@StaticsFinal
class FreezeMe {
public static FROZEN_STATIC: string = "I am frozen";
}
class EditMyStuff {
public static NON_FROZEN_STATIC: string = "I am frozen";
}
// Test here
FreezeMe.FROZEN_STATIC = "I am not frozen.";
EditMyStuff.NON_FROZEN_STATIC = "I am not frozen.";
console.log(FreezeMe.FROZEN_STATIC); // => "I am frozen."
console.log(EditMyStuff.NON_FROZEN_STATIC); // => "I am not frozen."