টাইপস্ক্রিপ্ট স্ট্যাটিক ক্লাস


145

আমি traditionalতিহ্যবাহী জেএস থেকে টাইপস্ক্রিপ্টে যেতে চেয়েছিলাম কারণ আমি সি # -র মতো সিনট্যাক্স পছন্দ করি। আমার সমস্যাটি হ'ল আমি টাইপস্ক্রিপ্টে স্ট্যাটিক ক্লাস কীভাবে ঘোষণা করব তা জানতে পারি না।

সি # তে আমি প্রায়শই স্থিতিশীল ক্লাসগুলি ভেরিয়েবল এবং পদ্ধতিগুলি সংগঠিত করতে, কোনও বস্তুকে তাত্ক্ষণিক না করে কোনও নামক শ্রেণিতে একত্রে রাখি। ভ্যানিলা জেএসে, আমি একটি সাধারণ জেএস বস্তুর সাথে এটি করতাম:

var myStaticClass = {
    property: 10,
    method: function(){}
}

টাইপস্ক্রিপ্টে, আমি বরং আমার সি-শার্পি পদ্ধতির জন্য যাব, তবে মনে হচ্ছে টিএস-তে স্ট্যাটিক ক্লাসগুলি নেই। এই সমস্যার উপযুক্ত সমাধান কী?

উত্তর:


166

টাইপস্ক্রিপ্ট সি # নয়, সুতরাং আপনার প্রয়োজনীয় টাইপ স্ক্রিপ্টে সি # এর একই ধারণাগুলি আশা করা উচিত নয়। প্রশ্ন হল আপনি স্থির শ্রেণি কেন চান?

সি # তে একটি স্ট্যাটিক শ্রেণি কেবল একটি শ্রেণি যা উপক্লাস করা যায় না এবং কেবল স্থির পদ্ধতি থাকতে হবে। সি # ক্লাসের বাইরে কার্যাবলী সংজ্ঞায়িত করতে দেয় না। তবে টাইপস্ক্রিপ্টে এটি সম্ভব।

যদি আপনি নিজের ফাংশন / পদ্ধতিগুলিকে কোনও নেমস্পেসে রাখার উপায় খুঁজছেন (যেমন গ্লোবাল নয়) তবে আপনি টাইপস্ক্রিপ্টের মডিউলগুলি বিবেচনা করতে পারেন, যেমন

module M {
    var s = "hello";
    export function f() {
        return s;
    }
}

যাতে আপনি বাহ্যিকভাবে এমএফ () অ্যাক্সেস করতে পারেন তবে গুলি নয় এবং আপনি মডিউলটি প্রসারিত করতে পারবেন না।

আরও তথ্যের জন্য টাইপস্ক্রিপ্ট স্পেসিফিকেশন দেখুন।


সুতরাং একটি মডিউল একটি স্থির পদ্ধতি থাকতে পারে, কিন্তু একটি বর্গ না পারে? তবে মডিউলগুলির স্থির ডেটা থাকতে পারে না। কোনও কিছু তাত্ক্ষণিক না করে ডেটা এবং কোড মোড়ানোর জন্য এটি জেএসের মতো সুবিধাজনক নয়।
dcsan

এটি .jsআপনার নিজের মধ্যে অন্তর্ভুক্ত করা প্রয়োজন যে অন্তর্ভুক্ত দরকারী হতে পারে html। সুতরাং Angular 2আপনি সম্ভবত ব্যবহার করছেন System... তাই করবেন System.import("Folder/M");(অথবা সংকলিত .jsফাইলের পথে যাই হোক না কেন )bootstrap import
সেরজ সাগান

11
এটি অবচয় করা হয়েছে। এছাড়াও tslint আপনাকে মডিউল এবং নেমস্পেসের জন্য আর এটি করতে দেয় না। এখানে পড়ুন: palantir.github.io/tslint/rules/no-namespace
ফ্লোরিয়ান লেইটজেব

স্ট্যাটিক ক্লাস করার জন্য আমার ইউজ-কেস রয়েছে। এই মুহুর্তে, আমার কাছে একটি ক্লাস রয়েছে যাতে কেবল স্থির পদ্ধতি থাকে। প্রকল্পে আমাদের প্রতিটি শ্রেণীর জন্য কিছু ধরণের কনফিগারেশন সরবরাহ করতে হবে যা তাত্ক্ষণিকভাবে তৈরি করা যেতে পারে। অবিচলিত হিসাবে এই ধরণের শ্রেণি ঘোষণা করা কেবল আমাকে তা খেয়াল করতে সহায়তা করবে না যে এটি তাত্ক্ষণিকভাবে করা হবে না তবে অন্যান্য বিকাশকারীরা এতে উদাহরণ সদস্যদের যুক্ত করা এড়াতে পারবেন।
mdarefull

@ ফ্লোরিয়ান লেইটজেব তখন পছন্দসই উপায় কী, কেবল স্থির পদ্ধতি এবং / অথবা বিমূর্ত কীওয়ার্ড সহ একটি শ্রেণি? এটি কেবল মডিউলের সাথে তুলনায়
কৃপণ

180

টাইপস্ক্রিপ্ট ১. থেকে অ্যাবস্ট্রাক্ট ক্লাসগুলি টাইপস্ক্রিপ্টের প্রথম শ্রেণির নাগরিক। আপনি কোনও বিমূর্ত ক্লাস ইনস্ট্যান্ট করতে পারবেন না।

এখানে একটি উদাহরণ:

export abstract class MyClass {         
    public static myProp = "Hello";

    public static doSomething(): string {
      return "World";
    }
}

const okay = MyClass.doSomething();

//const errors = new MyClass(); // Error

6
স্ট্যাটিক ক্লাসগুলির সাথে কাজ করার সময়, এটি সেরা সাড়া এবং আমি এটিকে উত্সাহ দিয়েছি। Singletonএকই বর্গ উদাহরণের ভাগ করা মেমরি প্যাটার্ন জন্য। এছাড়াও, একটি স্ট্যাটিক শ্রেণীর সংজ্ঞা অনুসারে কোনও উদাহরণ নেই, তাই ক্লায়েন্ট যদি এটি আরম্ভ করার চেষ্টা করে তবে আপনাকে অবশ্যই একটি ব্যতিক্রম ছুঁড়ে ফেলতে হবে।
loretoparisi

1
আমরা কি একটি বিমূর্ত ক্লাস করতে পারি?
কিমিচিমন

@ কিমচিমন - হ্যাঁ, abstractকীওয়ার্ডটি টাইপস্ক্রিপ্টে সমর্থিত।
ফেন্টন

1
ব্যবহারের জন্য আপডেট abstract! @ কিমচিমন - দুর্দান্ত ধারণা!
ওবিসিডিয়ান

3
কনস্ট্রাক্টরকে ব্যক্তিগত হিসাবে চিহ্নিত করার চেয়ে এটি কি আরও ভাল পন্থা?
জোড়ো তেনেভ

72

স্থিতিশীল বৈশিষ্ট্য এবং শ্রেণীর পদ্ধতি নির্ধারণ টাইপস্ক্রিপ্ট ভাষা নির্দিষ্টকরণের 8.2.1 এ বর্ণিত হয়েছে :

class Point { 
  constructor(public x: number, public y: number) { } 
  public distance(p: Point) { 
    var dx = this.x - p.x; 
    var dy = this.y - p.y; 
    return Math.sqrt(dx * dx + dy * dy); 
  } 
  static origin = new Point(0, 0); 
  static distance(p1: Point, p2: Point) { 
    return p1.distance(p2); 
  } 
}

Point.distance()একটি স্ট্যাটিক (বা "শ্রেণি") পদ্ধতিটি কোথায় ।


14
এটি স্থিতিশীল পদ্ধতি কীভাবে তৈরি করবেন তা দেখায় , এটি স্থির শ্রেণি সম্পর্কে যে প্রশ্নের উত্তর দেয় না (যদি না আসল প্রশ্নটি আসলে স্ট্যাটিক পদ্ধতি সম্পর্কে না থাকে)।
মার্কাস

18
মন্তব্যের জন্য ধন্যবাদ. এটি বর্ণনা করে যে কীভাবে স্থিতিশীল বৈশিষ্ট্য এবং পদ্ধতি তৈরি করা যায়, যা একসাথে নেওয়া কোনও ব্যক্তিকে তাত্ক্ষণিকতা ছাড়াই ডেটা এবং কার্যকারিতা সহ একটি শ্রেণি তৈরি করতে দেয় allows বিশেষত কোনও "স্ট্যাটিক শ্রেণি" না হলেও এটি ওপির জাভাস্ক্রিপ্ট উদাহরণ দ্বারা বর্ণিত প্রয়োজনীয়তা পূরণ করে।
রব রাইচ

গ # এর সংস্করণ 2 অবধি স্ট্যাটিক ক্লাস ছিল না সেগুলি কেবল সি # তে উপস্থিত রয়েছে যাতে আপনি তাদের ইনস্ট্যান্টেশন প্রতিরোধ করতে পারেন। আপনি জাভাস্ক্রিপ্ট দিয়ে এটি করতে পারবেন না যাতে এটি বেশি বোঝায় না
সাইমন_উইভার

4
@ সিমন_উইভার আপনি জাভাস্ক্রিপ্টে কি করতে পারবেন না? ক্লাস তাত্ক্ষণিকভাবে প্রতিরোধ করা? টাইপস্ক্রিপ্ট যাইহোক রানটাইম সম্পর্কে খুব বেশি যত্ন করে না, যতক্ষণ না আপনি যখন আমাদের স্টাফগুলি করার চেষ্টা করেন তখন আপনার যখন আমাদের একটি প্রয়োজন সংকলন ত্রুটি হয় ততক্ষণ আপনার প্রয়োজন হয় না।
অ্যালেক্স

আমি অনুমান করি আমার অর্থটি কী ছিল 'সংস্করণ 2 পর্যন্ত আমাদের কাছে ক্লাস স্তরে স্থিতিশীল কীওয়ার্ড ছিল না (যার অর্থ আপনি কোনও শ্রেণীর উদাহরণ তৈরি করতে পারবেন না)' তবে এটি আবার পড়া আমার মনে হয় আমার মন্তব্যটির ধরণটি মিস হয়েছে যাইহোক পয়েন্ট। ওপি সত্যিই পুরো ক্লাসের জন্য 'স্ট্যাটিক কীওয়ার্ড'
খুঁজছিল না

20

এই প্রশ্নটি বেশ তারিখী তবুও আমি একটি উত্তর দিতে চেয়েছিলাম যা ভাষার বর্তমান সংস্করণটি উপস্থাপন করে। দুর্ভাগ্যক্রমে স্ট্যাটিক ক্লাসগুলি এখনও টাইপস্ক্রিপ্টে বিদ্যমান নেই তবে আপনি এমন কোনও ক্লাস লিখতে পারেন যা কেবলমাত্র একটি প্রাইভেট কনস্ট্রাক্টর ব্যবহার করে একটি ছোট ওভারহেডের সাথে একই রকম আচরণ করে যা ক্লাসগুলি বাইরের থেকে ইনস্ট্যান্টেশন বাধা দেয়।

class MyStaticClass {
    public static readonly property: number = 42;
    public static myMethod(): void { /* ... */ }
    private constructor() { /* noop */ }
}

এই স্নিপেটটি আপনাকে কেবল # পার্শ্ববর্তী অংশের সাথে "স্থিতিশীল" ক্লাসগুলি ব্যবহার করার অনুমতি দেবে যা কেবলমাত্র এমন অন্তর্নিহিত দিক দিয়ে এখনও ভিতরে থেকে তাদের ইনস্ট্যান্ট করা সম্ভব। ভাগ্যক্রমে যদিও আপনি ব্যক্তিগত নির্মাণকারীর সাথে ক্লাস বাড়িয়ে দিতে পারবেন না।


9

এটি একটি উপায়:

class SomeClass {
    private static myStaticVariable = "whatever";
    private static __static_ctor = (() => { /* do static constructor stuff :) */ })();
}

__static_ctorএখানে তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন। টাইপস্ক্রিপ্ট উত্পন্ন শ্রেণীর শেষে কল করতে কোড আউটপুট দেবে।

আপডেট: স্ট্যাটিক কন্সট্রাক্টরগুলির জেনেরিক ধরণের জন্য, যাদের আর স্ট্যাটিক সদস্যদের দ্বারা রেফারেন্স করার অনুমতি নেই, আপনার এখন অতিরিক্ত পদক্ষেপের প্রয়োজন হবে:

class SomeClass<T> {
    static myStaticVariable = "whatever";
    private ___static_ctor = (() => { var someClass:SomeClass<T> ; /* do static constructor stuff :) */ })();
    private static __static_ctor = SomeClass.prototype.___static_ctor();
}

অবশ্যই যে কোনও ক্ষেত্রে, আপনি কেবল ক্লাসের পরে জেনেরিক টাইপ স্ট্যাটিক কনস্ট্রাক্টরকে কল করতে পারেন , যেমন:

class SomeClass<T> {
    static myStaticVariable = "whatever";
    private __static_ctor = (() => { var example: SomeClass<T>; /* do static constructor stuff :) */ })();
}
SomeClass.prototype.__static_ctor();

শুধু কখনও ব্যবহার মনে রাখবেন thisমধ্যে __static_ctor(স্পষ্টত) উপরে।


এই উপায়ে এখনও বর্গ জন্য একটি নির্মাতাকে emits।
theycallmemorty

1
"এই উপায়" হ্যাক এবং এটি প্রত্যাশার মতো সংকলকটির সাধারণ ক্রিয়াকে পরিবর্তন করে না। এমনকি class SomeClass {}একটি নির্মাতা জেনারেট করে - কোনও নতুন ইস্যু প্রবর্তিত হওয়ায় কমই মন্তব্য করা উপযুক্ত। ;) এফওয়াইআই: জেএসে কোনও সত্যিকারের "কন্সট্রাক্টর" নেই - কেবলমাত্র ফাংশনগুলির মধ্যে "এই" থাকে যখন বস্তুগুলিতে বা তার মাধ্যমে ডাকা হয় new। এটি কোনও "শ্রেণীর" জন্য যাই হোক না কেন এটি বিদ্যমান।
জেমস উইলকিনস

6

আমি আজ একই ব্যবহারের কেস পেয়েছি (31/07/2018) এবং এটিকে একটি কাজের ভিত্তিতে পেয়েছি। এটি আমার গবেষণার উপর ভিত্তি করে এবং এটি আমার পক্ষে কাজ করেছিল। প্রত্যাশা - টাইপস্ক্রিপ্টে নিম্নলিখিত অর্জনের জন্য:

var myStaticClass = {
    property: 10,
    method: function(){} 
}

আমি এটা করেছি:

//MyStaticMembers.ts
namespace MyStaticMembers {
        class MyStaticClass {
           static property: number = 10;
           static myMethod() {...}
        }
        export function Property(): number {
           return MyStaticClass.property;
        }
        export function Method(): void {
           return MyStaticClass.myMethod();
        }
     }

সুতরাং আমরা এটি নীচের মত গ্রাস করব:

//app.ts
/// <reference path="MyStaticMembers.ts" />
    console.log(MyStaticMembers.Property);
    MyStaticMembers.Method();

এটি আমার পক্ষে কাজ করেছে। কারও কাছে যদি আরও ভাল পরামর্শ থাকে তবে দয়া করে আমাদের সবাই এটি শুনতে দিন !!! ধন্যবাদ ...


3

সি # এর মতো ভাষার স্ট্যাটিক ক্লাসগুলি বিদ্যমান কারণ গ্রুপের ডেটা এবং ফাংশনগুলিতে কোনও শীর্ষ-স্তরের নির্মাণ নেই। জাভাস্ক্রিপ্টে, তবে তারা তা করে এবং তাই আপনার মতো কোনও অবৈধ ঘোষনা করা অনেক বেশি স্বাভাবিক। শ্রেণীর বাক্য গঠন আরও ঘনিষ্ঠভাবে অনুকরণ করার জন্য, আপনি এর মতো পদ্ধতিগুলি ঘোষণা করতে পারেন:

const myStaticClass = {
    property: 10,

    method() {

    }
}

1
এই দৃষ্টিভঙ্গিটি কি আপনার কর্মপ্রবাহকে বিঘ্নিত করে না? একদিকে আপনি ক্লাস এবং দৃষ্টান্তগুলি ব্যবহার করেন এবং তারপরে হঠাৎ আপনি আবার নিয়মিত পুরানো জেএস বিষয়বস্তুগুলিতে ডেটা ঘোষণা করা শুরু করেন ... স্ট্যাটিক ক্লাসগুলি ব্যবহার করে পাঠ্যবিলাসকেও সহায়তা করে, এটি কেবল ভাষার অভ্যন্তরীণ কাজের ক্ষেত্রে নয়।
কোকোডোকো

4
আমি আমার কর্মপ্রবাহের সাথে এটি বিশৃঙ্খলা খুঁজে পাই না; বিপরীতে, আমি ক্লাসহীন জাভাস্ক্রিপিট অবজেক্টগুলি বা মডিউলটিতে কেবল সরল ফাংশন এবং ধ্রুবক ব্যবহার করা খুব সুবিধাজনক বলে মনে করি। তবে, আমি যতটা সম্ভব বিশ্বব্যাপী রাষ্ট্র এড়াতে চেষ্টা করি, তাই স্থির শ্রেণীর ভেরিয়েবলগুলির মতো আমার খুব কমই প্রয়োজন হয়।
যোগু

1

Http://www.basarat.com/2013/04/typescript-static-constructors-for.html দেখুন

এটি স্ট্যাটিক কনস্ট্রাক্টরকে 'নকল' করার একটি উপায়। এটি এর ঝুঁকি ছাড়াই নয় - রেফারেন্সড কোডপ্লেক্স আইটেমটি দেখুন

class Test {
    static foo = "orig";

    // Non void static function
    static stat() {
        console.log("Do any static construction here");
        foo = "static initialized";
        // Required to make function non void
        return null;
    }
    // Static variable assignment
    static statrun = Test.stat();
}

// Static construction will have been done:
console.log(Test.foo);

1

এটি অর্জনের একটি সম্ভাব্য উপায় হ'ল অন্য শ্রেণীর মধ্যে কোনও শ্রেণির স্থির দৃষ্টান্ত। উদাহরণ স্বরূপ:

class SystemParams
{
  pageWidth:  number = 8270;
  pageHeight: number = 11690;  
}

class DocLevelParams
{
  totalPages: number = 0;
}

class Wrapper
{ 
  static System: SystemParams = new SystemParams();
  static DocLevel: DocLevelParams = new DocLevelParams();
}

তারপরে পরামিতিগুলির কোনও উদাহরণ না বলেই র‍্যাপার ব্যবহার করে অ্যাক্সেস করা যায়। উদাহরণ স্বরূপ:

Wrapper.System.pageWidth = 1234;
Wrapper.DocLevel.totalPages = 10;

সুতরাং আপনি জাভাস্ক্রিপ্ট টাইপ অবজেক্টের সুবিধাগুলি পাবেন (মূল প্রশ্নে বর্ণিত হিসাবে) তবে টাইপস্ক্রিপ্ট টাইপিং যুক্ত করতে সক্ষম হওয়ার সুবিধা সহ। অতিরিক্তভাবে, এটি ক্লাসের সমস্ত পরামিতিগুলির সামনে 'স্ট্যাটিক' যুক্ত করা এড়ানো হয়।


1

ES6 বাহ্যিক মডিউলগুলির সাহায্যে এটি এর মতো অর্জন করা যায়:

// privately scoped array
let arr = [];

export let ArrayModule = {
    add: x => arr.push(x),
    print: () => console.log(arr),
}

এটি অভ্যন্তরীণ মডিউল এবং নেমস্পেসগুলির ব্যবহারকে বাধা দেয় যা টিএসলিন্ট [1] [2] দ্বারা খারাপ অভ্যাস হিসাবে বিবেচিত হয় , ব্যক্তিগত এবং পাবলিক স্কোপিংয়ের অনুমতি দেয় এবং অবাঞ্ছিত শ্রেণীর অবজেক্টগুলির সূচনা রোধ করে।


0

আমি অনুরূপ কিছু সন্ধান করছিলাম এবং ডেকে আনে এমন কিছু সংলগ্ন Singleton Pattern

তথ্যসূত্র: একক প্যাটার্ন

আমি বিভিন্ন ধরণের ফাইল লোড করতে একটি বাল্কলডার শ্রেণিতে কাজ করছি এবং এর জন্য সিঙ্গলটন প্যাটার্নটি ব্যবহার করতে চাই। এইভাবে আমি আমার প্রধান অ্যাপ্লিকেশন শ্রেণি থেকে ফাইলগুলি লোড করতে এবং অন্যান্য শ্রেণীর কাছ থেকে লোড হওয়া ফাইলগুলি সহজেই পুনরুদ্ধার করতে পারি।

নীচে একটি সহজ উদাহরণ দেওয়া হল যে কীভাবে আপনি টাইপস্ক্রিপ্ট এবং সিঙ্গলটন প্যাটার্ন সহ কোনও গেমের জন্য স্কোর পরিচালক করতে পারেন make

ক্লাস সিঙ্গলটনক্লাস {

private static _instance:SingletonClass = new SingletonClass();

private _score:number = 0;

constructor() {
    if(SingletonClass._instance){
        throw new Error("Error: Instantiation failed: Use SingletonDemo.getInstance() instead of new.");
    }
    SingletonClass._instance = this;
}

public static getInstance():SingletonClass
{
    return SingletonClass._instance;
}

public setScore(value:number):void
{
    this._score = value;
}

public getScore():number
{
    return this._score;
}

public addPoints(value:number):void
{
    this._score += value;
}

public removePoints(value:number):void
{
    this._score -= value;
}   }

তারপরে আপনার অন্যান্য শ্রেণীর যে কোনও জায়গায় আপনি সিঙ্গলটনের মাধ্যমে অ্যাক্সেস পাবেন:

var scoreManager = SingletonClass.getInstance();
scoreManager.setScore(10); scoreManager.addPoints(1);
scoreManager.removePoints(2); console.log( scoreManager.getScore() );

0

আপনি namespaceআপনার ভেরিয়েবলগুলি, শ্রেণিগুলি, পদ্ধতিগুলি ইত্যাদির জন্য কীওয়ার্ডটিও ব্যবহার করতে পারেন । ডক দেখুন

namespace Validation {
    export interface StringValidator {
        isAcceptable(s: string): boolean;
    }

    const lettersRegexp = /^[A-Za-z]+$/;
    const numberRegexp = /^[0-9]+$/;

    export class LettersOnlyValidator implements StringValidator {
        isAcceptable(s: string) {
            return lettersRegexp.test(s);
        }
    }

    export class ZipCodeValidator implements StringValidator {
        isAcceptable(s: string) {
            return s.length === 5 && numberRegexp.test(s);
        }
    }
}

উপরে ফ্লোরিয়ান দেখা মন্তব্য "এই অবচিত এছাড়াও tslint আপনি মডিউল এবং নামব্যবধান জন্য আর তা করতে দেওয়া হবে না এখানে পড়তে।। Palantir.github.io/tslint/rules/no-namespace"
reggaeguitar
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.