একটি সূচক স্বাক্ষর পরামিতি প্রকারটি ইউনিয়নের ধরণ হতে পারে না। পরিবর্তে একটি ম্যাপযুক্ত বস্তুর প্রকারটি বিবেচনা করুন


100

আমি নিম্নলিখিত প্যাটার্নটি ব্যবহার করার চেষ্টা করছি:

enum Option {
  ONE = 'one',
  TWO = 'two',
  THREE = 'three'
}

interface OptionRequirement {
  someBool: boolean;
  someString: string;
}

interface OptionRequirements {
  [key: Option]: OptionRequirement;
}

এটি আমার কাছে খুব সোজা মনে হয় তবে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

একটি সূচক স্বাক্ষর প্যারামিটার ধরণ ইউনিয়নের ধরণ হতে পারে না। পরিবর্তে একটি ম্যাপযুক্ত বস্তুর প্রকারটি বিবেচনা করুন।

আমি কি ভুল করছি?


4
প্রকারটি keyকেবল স্ট্রিং, সংখ্যা বা প্রতীক হতে পারে। এনাম হয় না।
ইউনিয়ন

উত্তর:


155

আপনি "ইন" অপারেটরটিতে টিএস ব্যবহার করতে পারেন এবং এটি করতে পারেন:

enum Options {
  ONE = 'one',
  TWO = 'two',
  THREE = 'three',
}
interface OptionRequirement {
  someBool: boolean;
  someString: string;
}
type OptionRequirements = {
  [key in Options]: OptionRequirement; // Note that "key in".
}

4
এর্ম, এটি সংকলন করে না? টাইপ করা বিষয় খেলার মাঠ বলেছেন : "একটি ইন্টারফেস একটি কম্পিউটেড সম্পত্তি নাম একটি অভিব্যক্তি যার ধরনের একটি আক্ষরিক টাইপ বা একটি 'অনন্য প্রতীক' ধরনের পড়ুন আবশ্যক।"
মেরিটন

19
এতে পরিবর্তন interface OptionRequirementsকরুনtype OptionRequirements
টাইলার রিক

4
এটি আসলে আমার পক্ষে কাজ করে না: একটি ইন্টারফেসের গণিত সম্পত্তি নাম অবশ্যই এমন একটি অভিব্যক্তিকে উল্লেখ করতে পারে যার প্রকারটি আক্ষরিক ধরণের বা 'অনন্য প্রতীক' প্রকারের
Tyguy7

আপনি দয়া করে বলতে পারেন আপনি টাইপস্ক্রিপ্টের কোন সংস্করণ ব্যবহার করছেন?
নাচো জাস্টিসিয়া রামোস

4
আমি এই উত্তরটি একটি ইন্টারফেসের পরিবর্তে কোনও ম্যাপযুক্ত টাইপ ওরফে ব্যবহার করার জন্য সম্পাদনা করেছি। মূল উত্তরটি আমি দেখেছি টাইপস্ক্রিপ্টের কোনও সংস্করণের অধীনে সংকলন করে না এবং অবশ্যই টাইপস্ক্রিপ্টের বর্তমান সংস্করণ (আগস্ট ২০২০ অনুসারে 4.0.০) সংকলন করে না। @ নাচো জাস্টিসিয়া রামোস, আপনি যদি দেখিয়ে দিতে পারেন যে আপনার মূল সংস্করণটি টাইপস্ক্রিপ্টের কিছু সংস্করণে আসলেই কোথাও কাজ করে, তবে আপনার পরিবেশটি কাজ করার জন্য আপনার প্রয়োজনীয় পরিবেশের বিবরণ সহ সম্পাদনাটি ফিরিয়ে দিতে পেরে আমি খুশি হব। চিয়ার্স!
jcalz

58

সবচেয়ে সহজ সমাধানটি ব্যবহার করা Record

type OptionRequirements = Record<Options, OptionRequirement>

আপনি নিজে এটিকে প্রয়োগ করতে পারেন:

type OptionRequirements = {
  [key in Options]: OptionRequirement;
}

এই কনস্ট্রাক্ট শুধুমাত্র জন্য উপলব্ধ type, কিন্তু না interface

আপনার সংজ্ঞায় সমস্যাটি বলছে যে আপনার ইন্টারফেসের কীটি টাইপ হওয়া উচিত Options, যেখানে Optionsএনাম, কোনও স্ট্রিং, সংখ্যা বা চিহ্ন নয়।

দ্য key in Options অর্থ "ইউনিয়ন ধরণের বিকল্পগুলিতে থাকা সেই নির্দিষ্ট কীগুলির জন্য"।

typeউরফ এর চেয়ে বেশি নমনীয় ও শক্তিশালী interface

আপনার টাইপ ক্লাসে ব্যবহার করা প্রয়োজন না হলে, নির্বাচন typeউপর interface


5

আমি কিছু একই সমস্যা ছিল কিন্তু আমার ক্ষেত্রে ইন্টারফেসে আরেকটি ক্ষেত্র সম্পত্তি সঙ্গে একটি উদাহরণ হিসাবে আমার সমাধান তাই সঙ্গে ছিল ঐচ্ছিক কী জন্য একটি enum মাঠে সম্পত্তি:

export enum ACTION_INSTANCE_KEY {
  cat = 'cat',
  dog = 'dog',
  cow = 'cow',
  book = 'book'
}

type ActionInstances = {
  [key in ACTION_INSTANCE_KEY]?: number; // cat id/dog id/cow id/ etc // <== optional
};

export interface EventAnalyticsAction extends ActionInstances { // <== need to be extended
  marker: EVENT_ANALYTIC_ACTION_TYPE; // <== if you wanna add another field to interface
}

4

ইন্টারফেস ব্যবহারের পরিবর্তে ম্যাপযুক্ত অবজেক্টের ধরণটি ব্যবহার করুন

enum Option {
  ONE = 'one',
  TWO = 'two',
  THREE = 'three'
}

type OptionKeys = keyof typeof Option;

interface OptionRequirement {
  someBool: boolean;
  someString: string;
}

type OptionRequirements = {                 // note type, not interface
  [key in OptionKeys]: OptionRequirement;   // key in
}

1

আমার ক্ষেত্রে আমার বৈশিষ্ট্যগুলি beচ্ছিক হওয়ার প্রয়োজন ছিল, তাই আমি এই জেনেরিক প্রকারটি তৈরি করেছি।

type PartialRecord<K extends string | number | symbol, T> = { [P in K]?: T; };

তারপরে এটি ব্যবহার করুন:

type MyTypes = 'TYPE_A' | 'TYPE_B' | 'TYPE_C';

interface IContent {
    name: string;
    age: number;
}

interface IExample {
    type: string;
    partials: PartialRecord<MyTypes, IContent>;
}

উদাহরণ

const example : IExample = {
    type: 'some-type',
    partials: {
        TYPE_A : {
            name: 'name',
            age: 30
        },
        TYPE_C : {
            name: 'another name',
            age: 50
        }
    }
}

0

আমারও একি দশা. কৌণিক ফর্ম ভ্যালিডিটার তৈরি করার সময় আমি কেবলমাত্র নির্দিষ্ট কীগুলি ব্যবহার করার চেষ্টা করছিলাম।

export enum FormErrorEnum {
  unknown = 'unknown',
  customError = 'customError',
}

export type FormError = keyof typeof FormErrorEnum;

এবং ব্যবহার:

static customFunction(param: number, param2: string): ValidatorFn {
  return (control: AbstractControl): { [key: FormErrorEnum]?: any } => {
    return { customError: {param, param2} };
  };
}

এটি 1 - এক্স সংখ্যার কী ব্যবহার করার অনুমতি দেবে।

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