টাইপস্ক্রিপ্টে প্রতীক-কী প্রকার হিসাবে প্রতীক ব্যবহার করা


20

আমি সঙ্গে একটি বস্তু সংজ্ঞায়িত করার চেষ্টা করছি প্রতীক কী-টাইপ হিসাবে যেহেতু MDN বলেছেন:

প্রতীক মানটি বস্তুর বৈশিষ্ট্যগুলির জন্য সনাক্তকারী হিসাবে ব্যবহৃত হতে পারে [...]

তবে কী-সম্পত্তি হিসাবে টাইপ হিসাবে এটি ব্যবহার:

type obj = {
    [key: symbol | string]: string
}

নিম্নলিখিত ত্রুটির ফলাফল:

TS1023: একটি সূচক স্বাক্ষর পরামিতি প্রকারের অবশ্যই 'স্ট্রিং' বা 'সংখ্যা' হওয়া আবশ্যক।

এমনকি এটি সূচক-প্রকার হিসাবে ব্যবহার করা যেতে পারে। আমি সর্বশেষ টাইপস্ক্রিপ্ট সংস্করণ ( v3.7.2) ব্যবহার করছি , সম্পর্কিত প্রশ্নগুলি আমি পেয়েছি:

আমি টাইপস্ক্রিপ্ট প্রতীক ডক্সও একবার দেখেছি তবে তারা কেবল দেখায় যে এটি কীভাবে মূল্য হিসাবে ব্যবহৃত হয়, টাইপ হিসাবে নয়।

উদাহরণ:

const obj = {} as {
    [key: number | symbol]: string // Won't work
};

const sym = Symbol('My symbol');
obj[sym] = 'Hi';

মাইক্রোসফ্ট / টাইপস্ক্রিপ্ট ইস্যু

ওপেন বৈশিষ্ট্য অনুরোধ


আমি মনে করি টাইপস্ক্রিপ্ট কেবল তার বস্তুর প্রকারের ঘোষণায় নির্দিষ্ট চিহ্নগুলিকে সমর্থন করে। আপনি কি সত্যিই চাও কোনো symbol ? আপনি কীভাবে আপনার ব্যবহার করতে চান তার একটি উদাহরণ দেখান type obj- আমি সন্দেহ করি যে সমস্ত চিহ্ন-কীড বৈশিষ্ট্যগুলি হবে string
বার্গি

@ বেরগি আমি একটি উদাহরণ যুক্ত করেছি, সম্ভবত আমি কিছু তদারকি করেছি তবে আমি একটি চিহ্ন গ্রহণ করার জন্য টিএস আনার কোনও উপায় খুঁজে পাই না ( anyযা ব্যবহার না করে খারাপ অভ্যাস)।
সাইমন


সঠিক কিনা তা নিশ্চিত নই তবে আপনি কী Map<Symbol,String>আমাদের মানচিত্র হিসাবে ব্যবহার করার চেষ্টা করেছেন , যদি আপনি এটি অর্জন করার চেষ্টা করছেন তার উদ্দেশ্যটি
সম্পাদন করে

আমার জন্য একই সমস্যা, আমি অনুমান করি যে বিরক্তিকর অংশটি "টিএস জেএসের সুপারস্টেট" কীভাবে - এর ঠিক মিথ্যা বিজ্ঞাপন। এটি এর নিখুঁত উদাহরণ।
প্যাট্রিক

উত্তর:


3

দুর্ভাগ্যক্রমে টাইপস্ক্রিপ্টে এই মুহূর্তে সম্ভব নয়। আপনার যদি এমন কিছু API গুলি প্রত্যাশা করে বা সত্য হিসাবে কী হিসাবে প্রতীক ব্যবহার করতে চায় তবে আপনাকে এই বিশ্রী সংস্করণটি করতে পারেন:

// Ensure we can not pass regular map to our custom functions
type SymbolMapTag = { readonly symbol: unique symbol }

type SymbolMap = SymbolMapTag & {
    [Key in string | number | symbol]: string;
}

function set_symbol<T extends SymbolMap, TSym extends symbol>
(target: T, sym: TSym, value: T[TSym]) {
    target[sym] = value;
}

function get_symbol<T extends SymbolMap, TSym extends symbol>
(target: T, sym: TSym): T[TSym] {
    return target[sym];
}

const symbol_map = {} as SymbolMap;

const sym = Symbol('My symbol');
set_symbol(symbol_map, sym, "hi");
get_symbol(symbol_map, sym); // string


type NonSymbolMap = {
    [Key in string | number]: string;
}

const non_symbol_map = {} as NonSymbolMap;
set_symbol(non_symbol_map, sym, "hi"); // error
get_symbol(non_symbol_map, sym); // error
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.