কীভাবে টাইপস্ক্রিপ্ট ইন্টারফেসে একটি নির্দিষ্ট স্ট্রিং দরকার


144

আমি একটি তৃতীয় পক্ষের জেএস লাইব্রেরির জন্য একটি টাইপস্ক্রিপ্ট সংজ্ঞা ফাইল তৈরি করছি। পদ্ধতি এক একটি অপশন বস্তুর জন্য অনুমতি দেয়, এবং বিকল্প বস্তুর বৈশিষ্ট্যাবলী এক তালিকা থেকে একটি স্ট্রিং স্বীকার করে: "collapse", "expand", "end-expand", এবং "none"।

বিকল্পগুলির অবজেক্টের জন্য আমার একটি ইন্টারফেস রয়েছে:

interface IOptions {
  indent_size?: number;
  indent_char?: string;
  brace_style?: // "collapse" | "expand" | "end-expand" | "none"
}

ইন্টারফেসটি এটিকে কার্যকর করতে পারে, সুতরাং আপনি যদি সম্পত্তিটির IOptionsসাথে কোনও বিষয় অন্তর্ভুক্ত করেন তবে brace_styleএটি কেবল গ্রহণযোগ্য তালিকায় থাকা একটি স্ট্রিংকে অনুমতি দেবে?


4
অনুগ্রহ করে এই প্রশ্নের উত্তরগুলি আবার দেখুন
— অ্যান্ড্রেয়াস

কিন্ডা @ আন্দ্রেসের মন্তব্যের লাইন ধরে আপনি কেন ডেনিস খয়ের চেয়ে রিয়ানকিউর উত্তর পছন্দ করেন ? ডেনিস'কে আরও বিস্তৃতভাবে প্রযোজ্য ইমো মনে হয়।
— রাফিন

উত্তর:


226

এটি 1.8 সংস্করণে "স্ট্রিং আক্ষরিক ধরণের" হিসাবে প্রকাশিত হয়েছিল

টাইপস্ক্রিপ্টে নতুন কী - স্ট্রিং লিটারাল প্রকারগুলি

পৃষ্ঠা থেকে উদাহরণ:

interface AnimationOptions {
  deltaX: number;
  deltaY: number;
  easing: "ease-in" | "ease-out" | "ease-in-out";
}

6
এটি অ্যাপ্লিকেশনে যেখানেই আপনাকে এই ধরণের স্ট্রিংটি একটি আর্গুমেন্ট হিসাবে পাস করার প্রয়োজন হবে সেখানে স্ট্রিংগুলির সাথে অনুলিপি এবং লাইন পেষ্ট করা দরকার। আপনি যদি সর্বদা পুরো অ্যানিমেশনঅ্যাপশন ব্যবহার করেন তবে সমাধানটি ঠিক আছে বলে মনে হয়, তবে ব্যবহারের ক্ষেত্রে আপনি যখন কেবল 'ইজিং' টাইপ করতে পারেন তা ভুল। ডেনিস খয়ের উত্তর দেখুন, এটি আরও ভাল।
— প্যাট্রিক Wlaź

121

এটা চেষ্টা কর

export type ReadingTypes = 'some'|'variants'|'of'|'strings';

export interface IReadings {
   param:ReadingTypes
}

12
এটি সঠিক হিসাবে চিহ্নিত করা উচিত, কারণ এটি কোনও অ্যাপ্লিকেশনের যে কোনও জায়গায় তৈরি হওয়া ধরণের পুনঃব্যবহারের অনুমতি দেয়।
— প্যাট্রিক Wlaź

এটি হ'ল আমি অঙ্কের ধরণের মান হিসাবে স্ট্রিংগুলির একটি অ্যারের পাস করার উপায় হিসাবে খুঁজছিলাম। এনামকে পুরোপুরি এড়িয়ে গিয়ে এবং ব্যবহার করে type, আমি নিম্নলিখিত উদাহরণটি পাস করতে সক্ষম হয়েছি: const myVar: ReadingTypes = ["some"|"variants"];এখনও একটি ডায়নামিক এনাম টাইপিং সিনট্যাক্স বজায় রেখে। সম্পূর্ণরূপে একমত যে এটি উত্তর হিসাবে সঠিক হিসাবে চিহ্নিত করা উচিত ছিল।
— এমডউসনদেব

এটি ব্যবহার করার কোনও উপায় আছে তবে এইভাবে ধীরে ধীরে টাইপ করার পরে type VisibilityTypes = VISIBILITY.PUBLISH | VISBIBILITY.DRAFTআমি একটি নেমস্পেস খুঁজে পাইনি ত্রুটিটি পাওয়া যায়, তবে আমি যখন তাদের হার্ড কোড করি তখন মনে হয় এটি কাজ করে
— ম্যাক্স ক্যারল

আমি একটি উপায় খুঁজে পেয়েছি এবং একটি নতুন উত্তর যুক্ত করেছি
— ম্যাক্স ক্যারল

10

সম্ভবত আপনি যা চেয়েছিলেন ঠিক তেমন নয় তবে এটি Enumআপনার জন্য একটি নিখুঁত সমাধান বলে মনে হচ্ছে।

enum BraceStyle {Collapse, Expand, EndExpand, None}

interface IOptions {
  indent_size?: number;
  indent_char?: string;
  brace_style?: BraceStyle
}

এনামগুলি তবে সংখ্যা ভিত্তিক। এর অর্থ রানটটাইমের সময় উদাহরণস্বরূপ একটি আসল মান BraceStyle.Collapseএই ক্ষেত্রে 0 হবে। তবে আপনি এগুলিকে অন্য এমনকি টাইপ-না-স্ক্রিপ্টের সাথেও ব্যবহার করতে পারেন, যেহেতু তারা অবজেক্টগুলিতে সংকলন করে। এইভাবে BraceStyleসংকলন ও পরিচালনা দেখাশোনা করবে:

{
    0: "Collapse",
    1: "Expand",
    2: "EndExpand",
    3: "None",
    Collapse: 0,
    Expand: 1,
    EndExpand: 2,
    None: 3
}

আপনি যদি তার পরিবর্তে স্ট্রিং চান, আপনি এখানে বর্ণিত হিসাবে স্থিতিশীল সদস্যদের সহ একটি বর্গ ব্যবহার করতে পারেন


enums এর স্ট্রিং মান থাকতে পারে (এখন কমপক্ষে, 2014 সালে তারা পারত কিনা তা নিশ্চিত নয়)। enum BraceStyle { Collapse = "Collapse", Expand = "Expand" }।
— ZachB

তারা যদি 2014 সালে করতে পারে তবে আমি আমার উত্তরে তা উল্লেখ করব।
— কুবা জাগোদা 5'19

8

টিএস নির্দিষ্ট স্ট্রিং মানগুলিতে টাইপিংয়ের প্রস্তাব দেয়, যাকে স্ট্রিং আক্ষরিক প্রকার বলা হয় ।

সেগুলি কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

type style =  "collapse" | "expand" | "end-expand" | "none";

interface IOptions {
  indent_size?: number;
  indent_char?: string;
  brace_style1?:  "collapse" | "expand" | "end-expand" | "none";
  brace_style2?:  style;
}

// Ok
let obj1: IOptions = {brace_style1: 'collapse'};

// Compile time error:
// Type '"collapsessss"' is not assignable to type '"collapse" | "expand" | "end-expand" | "none" | undefined'.
let obj2: IOptions = {brace_style1: 'collapsessss'};

1
function keysOf<T>(obj: T, key: keyof T) { return obj[key]; }
interface SomeInterface {
   a: string;
}
const instance: SomeInterface = { a: 'some value'};
let value = keysOf<SomeInterface>(instance, 'b'); // invalid
value =  keysOf<SomeInterface>(instance, 'a'); // valid

1

টাইপস্ক্রিপ্ট ২.৪-এর পরে আপনি স্ট্রিং এনামগুলি ব্যবহার করতে পারেন

আমি এই পদ্ধতির পক্ষে, কারণ এটি একাধিক স্থানে একইরকম হার্ড কোডিং স্ট্রিংয়ের প্রয়োজনীয়তা এড়ায়।

মানগুলি যেখানে স্ট্রিং থাকে সেখানে এনাম তৈরি করা সম্ভব

export enum VISIBILITY {
  PUBLISH = "publish",
  DRAFT = "draft"
}

এই এনামটি তখন ইন্টারফেস বা ক্লাসে টাইপ হিসাবে ব্যবহার করা যেতে পারে

export interface UserOptions  {
  visibility:  VISIBILITY 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.