স্ট্রিংগুলির অ্যারে হিসাবে টাইপস্ক্রিপ্ট ইন্টারফেসের কীগুলি পান


113

তাদের কাছে কী কলাম রয়েছে তার জন্য আমি লাভফিল্ড এবং তাদের নিজ নিজ ইন্টারফেসে প্রচুর টেবিল পেয়েছি
উদাহরণ:

export interface IMyTable {
  id: number;
  title: string;
  createdAt: Date;
  isDeleted: boolean;
}

আমি এই ইন্টারফেসের সম্পত্তির নামটি এর মতো একটি অ্যারে রাখতে চাই:

const IMyTable = ["id", "title", "createdAt", "isDeleted"];

আমি IMyTableসরাসরি ইন্টারফেসের উপর ভিত্তি করে কোনও অবজেক্ট / অ্যারে তৈরি করতে পারি না যা কৌশলটি করা উচিত কারণ আমি টেবিলগুলির ইন্টারফেসের নামটি গতিশীলভাবে পেয়েছি। সুতরাং ইন্টারফেসে এই বৈশিষ্ট্যগুলি নিয়ে আমার পুনরাবৃত্তি হওয়া এবং এটির একটি অ্যারে নেওয়া দরকার।

আমি এই ফলাফলটি কীভাবে অর্জন করব?

উত্তর:


57

এর মতো টাইপ করা বিষয় 2.3 (অথবা আমি বলতে হবে 2.4 , হিসাবে 2.3 এই বৈশিষ্ট্যটি রয়েছে একটি বাগ যা সংশোধন করা হয়েছে typescript@2.4-dev ), আপনি অর্জন করতে কি আপনি কি করতে চান একটি কাস্টম ট্রান্সফরমার তৈরি করতে পারেন।

আসলে, আমি ইতিমধ্যে একটি কাস্টম ট্রান্সফর্মার তৈরি করেছি, যা নিম্নলিখিতগুলি সক্ষম করে।

https://github.com/kimamula/ts-transformer-keys

import { keys } from 'ts-transformer-keys';

interface Props {
  id: string;
  name: string;
  age: number;
}
const keysOfProps = keys<Props>();

console.log(keysOfProps); // ['id', 'name', 'age']

দুর্ভাগ্যক্রমে, কাস্টম ট্রান্সফর্মারগুলি বর্তমানে ব্যবহার করা এত সহজ নয়। আপনি তাদের সাথে ব্যবহার করতে হবে টাইপ করা বিষয় পরিবর্তে টিএসসি কমান্ড নির্বাহ রূপান্তরের API- টি। নেই একটি বিষয় কাস্টম ট্রান্সফরমার জন্য একটি প্লাগইন সমর্থন অনুরোধ করা হচ্ছে।


আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ, আমি ইতিমধ্যে গতকাল এই কাস্টম ট্রান্সফর্মারটি দেখেছি এবং ইনস্টল করেছি তবে যেহেতু এটি টাইপস্ক্রিপ্ট ২.৪ ব্যবহার করে, এটি এখনকার মতো আমার কোনও কাজে আসেনি।
তুষার শুক্লা

17
হাই, এই লাইব্রেরিটি ঠিক আমার প্রয়োজনীয়তাও সরবরাহ করে, তবে, ts_transformer_keys_1.keys is not a functionডকুমেন্টেশনের সঠিক পদক্ষেপগুলি অনুসরণ করার পরে আমি পাচ্ছি I এটা কি কোন কাজ আছে?
হাসিথা শান

ঝরঝরে! আপনি কি মনে করেন এটি ডায়নামিক টাইপ প্যারামিটার (রিডমে নোট 2) নিতে বাড়ানো যেতে পারে?
কেনিশিন

@ হাশিতাশান ডক্সে নিবিড়ভাবে দেখুন - আপনাকে কাজের জন্য প্যাকেজটির জন্য টাইপস্ক্রিপ্ট সংকলক এপিআই ব্যবহার করতে হবে
ইয়ারোস্লাভ বাই

4
দুর্ভাগ্যক্রমে, প্যাকেজটি নষ্ট হয়ে গেছে, আমি যা যা করি তা সবসময়ই পাচ্ছিts_transformer_keys_1.keys is not a function
fr1sk

20

নিম্নলিখিতগুলির জন্য আপনার নিজের কীগুলি তালিকাভুক্ত করা প্রয়োজন, তবে কমপক্ষে টাইপসক্রিপ্ট কার্যকর করতে হবে IUserProfileএবং IUserProfileKeysঠিক একই কীগুলি হবে ( Required<T>টাইপস্ক্রিপ্ট ২.৮ এ যুক্ত হয়েছিল ):

export interface IUserProfile  {
  id: string;
  name: string;
};
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const IUserProfileKeys: KeysEnum<IUserProfile> = {
  id: true,
  name: true,
};

বেশ দুর্দান্ত কৌশল। এখন সমস্ত কীগুলি প্রয়োগ করা কার্যকর IUserProfileকরা সহজ এবং কনস্ট থেকে তাদের আহরণ করা সহজ IUserProfileKeys। এটি ঠিক আমি যা খুঁজছিলাম। আমার সমস্ত ইন্টারফেস এখন ক্লাসে রূপান্তর করার দরকার নেই।
অ্যান্ডডো

17

আমার অনুরূপ সমস্যা ছিল যে আমার কাছে এমন একটি বৈশিষ্ট্যগুলির একটি বিশাল তালিকা ছিল যা আমি একটি ইন্টারফেস এবং এর বাইরে একটি বস্তু উভয়ই রাখতে চাইতাম।

দ্রষ্টব্য: আমি বৈশিষ্ট্যগুলি দুটিবার (কীবোর্ড দিয়ে টাইপ) লিখতে চাইনি! শুধু শুকনো।


এখানে একটি বিষয় লক্ষণীয়, ইন্টারফেসগুলি সংকলন-সময়ে প্রয়োগ করা প্রকারভেদ, যখন অবজেক্টগুলি বেশিরভাগ রান-টাইম থাকে। ( উত্স )

@ ডেরেক যেমন অন্য উত্তরে উল্লিখিত হয়েছে , ইন্টারফেস এবং অবজেক্টের সাধারণ ডিনোমিনেটর এমন একটি শ্রেণি হতে পারে যা একটি প্রকার এবং মান উভয়কেই পরিবেশন করে ।

সুতরাং, টিএল; ডিআর, নিম্নলিখিত কোডের অংশটি চাহিদা পূরণ করবে:

class MyTableClass {
    // list the propeties here, ONLY WRITTEN ONCE
    id = "";
    title = "";
    isDeleted = false;
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// This is the pure interface version, to be used/exported
interface IMyTable extends MyTableClass { };

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// Props type as an array, to be exported
type MyTablePropsArray = Array<keyof IMyTable>;

// Props array itself!
const propsArray: MyTablePropsArray =
    Object.keys(new MyTableClass()) as MyTablePropsArray;

console.log(propsArray); // prints out  ["id", "title", "isDeleted"]


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// Example of creating a pure instance as an object
const tableInstance: MyTableClass = { // works properly!
    id: "3",
    title: "hi",
    isDeleted: false,
};

( এখানে টাইপ করা বিষয় খেলার মাঠে উপরের কোড আরো খেলতে হয়)

পুনশ্চ. আপনি যদি শ্রেণীর বৈশিষ্ট্যগুলিতে প্রাথমিক মান নির্ধারণ করতে না চান এবং প্রকারের সাথে থাকতে চান তবে আপনি কনস্ট্রাক্টর ট্রিক করতে পারেন:

class MyTableClass {
    // list the propeties here, ONLY WRITTEN ONCE
    constructor(
        readonly id?: string,
        readonly title?: string,
        readonly isDeleted?: boolean,
    ) {}
}

console.log(Object.keys(new MyTableClass()));  // prints out  ["id", "title", "isDeleted"] 

টাইপস্ক্রিপ্ট খেলার মাঠে কনস্ট্রাক্টর ট্রিক


propsArrayআপনি কীগুলি শুরু করার সময় কেবল তখনই অ্যাক্সেসযোগ্য।
ডেনকুইয়ার

আপনি "ইনিশিয়ালড" @ এডেনকুইয়ার বলতে কী বোঝাতে চাই তা পাই না। প্রথম উদাহরণে, উদাহরণস্বরূপ, উদাহরণস্বরূপ propsArrayশুরুর tableInstanceআগে স্পষ্টরূপে যদি আপনি যা বোঝাতে চেয়েছিলেন তবে তা উপলব্ধ । তবে, আপনি যদি নির্ধারিত নকল মানগুলি উল্লেখ করছেন তবে MyTableClassসেগুলি খুব শীঘ্রই বৈশিষ্ট্যের "ধরণ" বোঝাতে হবে। আপনি যদি এগুলি না চান তবে আপনি PS উদাহরণে কনস্ট্রাক্টর ট্রিক দিয়ে যেতে পারেন।
এইডিন

4
আমার বোধগম্যতে যখন কোনও মান থাকে তখন একটি মান শুরু করা হয়। আপনার "কন্সট্রাক্টর ট্রিক" বিভ্রান্তিকর কারণ আপনি কেবল উত্তরটির MyTableClassসাথে প্রতিস্থাপন করতে পারবেন না এবং propsArrayঅ্যান্টিটাইয়ালাইজড ওয়ার এবং কী টাইপগুলি রান-টাইমে ছিনিয়ে নেওয়া হিসাবে কীগুলি পাওয়ার আশা করছেন । আপনার সবসময় তাদের কোনও না কোনও ডিফল্ট মান সরবরাহ করতে হয়। আমি খুঁজে পেয়েছি যে সেগুলি দিয়ে আরম্ভ করা undefinedসর্বোত্তম পন্থা।
ডেনকুইয়ার

4
@ আইডিন আপনার সমাধানের জন্য আপনাকে ধন্যবাদ আমিও ভাবছি যে আমি পরামিতিগুলির সূচনাটি এড়াতে পারি কিনা। আমি যদি কনস্ট্রাক্টর ট্রিকটি ব্যবহার করি তবে আমি আর এমন একটি ইন্টারফেস তৈরি করতে পারছি না যা মাই টেবিলক্লাস প্রসারিত করবে .. টাইপস্ক্রিপ্ট প্লেগ্রাউন্ডের লিঙ্কে আপনার কনস্ট্রাক্টর ট্রিকটি খালি রয়েছে
ফ্লায়োন

4
@ ফ্লিয়ন, এটি লক্ষ্য করার জন্য ধন্যবাদ আমি কেবল কনস্ট্রাক্টর ট্রিকের জন্য খেলার মাঠের লিঙ্কটি আপডেট করেছি। এটি এখন কাজ করে কিনা দেখুন।
এইডিন

11

হতে পারে এটি খুব দেরী হয়েছে, তবে টাইপস্ক্রিপ্টের ২.১ সংস্করণে আপনি এটি ব্যবহার করতে পারেন key of:

interface Person {
    name: string;
    age: number;
    location: string;
}

type K1 = keyof Person; // "name" | "age" | "location"
type K2 = keyof Person[];  // "length" | "push" | "pop" | "concat" | ...
type K3 = keyof { [x: string]: Person };  // string

ডক: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html#keyof-and-lookup-tyype


উত্তরের জন্য ধন্যবাদ তবে নিশ্চিত না যে এটি ইন্টারফেস থেকে স্ট্যাটিকালি তৈরি টাইপগুলি কাউকে ব্যবহার করতে সহায়তা করে কিনা sure আইএমএইচও, আমরা বেশিরভাগ ক্ষেত্রে ইন্টারফেস / প্রকারকে আন্তঃ বিনিময়যোগ্যভাবে ব্যবহার করতে পারি। এছাড়াও এটি একাধিক ইন্টারফেসের জন্য ম্যানুয়াল আকারের তৈরির প্রয়োজন require তবে সমাধানটি যদি দেখতে খুব ভাল লাগে তবে কারও যদি কোনও ইন্টারফেস থেকে প্রকারের প্রয়োজন হয়।
তুষার শুক্লা

9

এই কাজ করা উচিত

var IMyTable: Array<keyof IMyTable> = ["id", "title", "createdAt", "isDeleted"];

বা

var IMyTable: (keyof IMyTable)[] = ["id", "title", "createdAt", "isDeleted"];

17
এটি ভুল নয়, তবে এখানে পরিষ্কার হতে হবে আপনি সঠিক হতে কেবল "অ্যারের মানগুলি প্রয়োগ করছেন"। বিকাশকারীকে এখনও এগুলি দুটি বার ম্যানুয়ালি লিখে রাখা দরকার।
এইডিন

যদিও এইডিন যা বলেছেন তা সত্য হতে পারে, কিছু ক্ষেত্রে, আমার ক্ষেত্রে এটি ছিল ঠিক ঠিক। ধন্যবাদ.
ড্যানিয়েল

4
এটি কী ডুপ্লিকেট বা হারিয়ে যাওয়া কীগুলি প্রতিরোধ করবে না। লাইকvar IMyTable: Array<keyof IMyTable> = ["id", "createdAt", "id"];
ফরড ০৪

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

8

নিরাপদ রূপগুলি

সুরক্ষা সংকলন-সময় চেক সহ একটি ইন্টারফেস থেকে কীগুলির একটি অ্যারে বা টুপল কী তৈরি করতে কিছুটা সৃজনশীলতার প্রয়োজন। প্রকারগুলি রান-টাইমে মুছে ফেলা হয় এবং অবজেক্টের ধরণগুলি (আনর্ডারড, নামযুক্ত) অসমর্থিত কৌশলগুলি অবলম্বন না করে টিপল ধরণের (অর্ডারযুক্ত, নামবিহীন) রূপান্তর করা যায় না ।

অন্যান্য উত্তরের সাথে তুলনা

এখানে প্রস্তাবিত রূপগুলি সমস্ত রেফারেন্স অবজেক্ট টাইপের মতো ডুপ্লিকেট বা হারিয়ে যাওয়া টিপল আইটেমগুলির ক্ষেত্রে একটি সংকলন ত্রুটি বিবেচনা / ট্রিগার করে IMyTable। উদাহরণস্বরূপ একটি অ্যারের ধরণের ঘোষণা (keyof IMyTable)[]এই ত্রুটিগুলি ধরতে পারে না।

তদতিরিক্ত, তাদের জন্য কোনও নির্দিষ্ট গ্রন্থাগারের (শেষ প্রকারের ব্যবহারগুলি ts-morph, যা আমি জেনেরিক সংকলক মোড়ক হিসাবে বিবেচনা করব) প্রয়োজন নেই, কোনও বস্তুর বিপরীতে একটি টুপল প্রকার নির্গত করুন (কেবলমাত্র প্রথম সমাধানটি অ্যারে তৈরি করে) বা প্রশস্ত অ্যারের ধরণের (সাথে তুলনা করুন) এই উত্তরগুলি ) এবং শেষ পর্যন্ত ক্লাসের দরকার নেই

বৈকল্পিক 1: সাধারণ টাইপ করা অ্যারে

// Record type ensures, we have no double or missing keys, values can be neglected
function createKeys(keyRecord: Record<keyof IMyTable, any>): (keyof IMyTable)[] {
  return Object.keys(keyRecord) as any
}

const keys = createKeys({ isDeleted: 1, createdAt: 1, title: 1, id: 1 })
// const keys: ("id" | "title" | "createdAt" | "isDeleted")[]

+স্বতঃসমাপ্তি অ্যারে +-সহ সহজ ম্যানুয়াল -, কোনও টুপল নেই

খেলার মাঠ

আপনি যদি কোনও রেকর্ড তৈরি করতে পছন্দ করেন না তবে এই বিকল্পটি Setএবং দৃser়তার সাথে জেনে নিন


বৈকল্পিক 2: সহায়ক ফাংশন দিয়ে টিপল

function createKeys<T extends readonly (keyof IMyTable)[] | [keyof IMyTable]>(
    t: T & CheckMissing<T, IMyTable> & CheckDuplicate<T>): T {
    return t
}

++-স্বয়ংক্রিয় সমাপ্তি +-আরও উন্নত, জটিল ধরণের সঙ্গে ম্যানুয়াল tuple

খেলার মাঠ

ব্যাখ্যা

createKeysকম্পাইল-টাইম চেকগুলি অতিরিক্ত দৃser়তার সাথে ফাংশন পরামিতি প্রকারটি মার্জ করে উপযুক্ত ইনপুট না দেওয়ার জন্য ত্রুটি নির্গত করে। কলি দিক থেকে অ্যারের পরিবর্তে টিপলের অনুপাত জোর করার (keyof IMyTable)[] | [keyof IMyTable]একটি "কালো যাদু" উপায় । বিকল্পভাবে, আপনি কলার পক্ষ থেকে / দৃ const় অবস্থানগুলিas const ব্যবহার করতে পারেন ।

CheckMissingচেকগুলি, যদি Tথেকে কীগুলি মিস করে U:

type CheckMissing<T extends readonly any[], U extends Record<string, any>> = {
    [K in keyof U]: K extends T[number] ? never : K
}[keyof U] extends never ? T : T & "Error: missing keys"

type T1 = CheckMissing<["p1"], {p1:any, p2:any}> //["p1"] & "Error: missing keys"
type T2 = CheckMissing<["p1", "p2"], { p1: any, p2: any }> // ["p1", "p2"]

দ্রষ্টব্য: T & "Error: missing keys"কেবলমাত্র ভাল আইডিই ত্রুটির জন্য। আপনিও লিখতে পারতেন neverCheckDuplicatesডাবল টুপল আইটেমগুলি পরীক্ষা করে:

type CheckDuplicate<T extends readonly any[]> = {
    [P1 in keyof T]: "_flag_" extends
    { [P2 in keyof T]: P2 extends P1 ? never :
        T[P2] extends T[P1] ? "_flag_" : never }[keyof T] ?
    [T[P1], "Error: duplicate"] : T[P1]
}

type T3 = CheckDuplicate<[1, 2, 3]> // [1, 2, 3]
type T4 = CheckDuplicate<[1, 2, 1]> 
// [[1, "Error: duplicate"], 2, [1, "Error: duplicate"]]

দ্রষ্টব্য: টিপলগুলিতে অনন্য আইটেমের চেকগুলিতে আরও ইনফোগুলি এই পোস্টে রয়েছে । সঙ্গে হিজড়া 4.1 , আমরা ত্রুটি স্ট্রিং অনুপস্থিত কী নাম করতে পারেন - কটাক্ষপাত করা এই খেলার মাঠ


বৈকল্পিক 3: রিকার্সিভ টাইপ

সংস্করণ ৪.১ সহ, টাইপসক্রিপটি আনুষ্ঠানিকভাবে শর্তসাপেক্ষ পুনরাবৃত্ত প্রকারগুলিকে সমর্থন করে , যা এখানেও সম্ভবত ব্যবহার করা যেতে পারে। যদিও, সংযুক্তি জটিলতার কারণে টাইপ গণনা ব্যয়বহুল - কর্মক্ষমতা 5-6 এর বেশি আইটেমের জন্য ব্যাপকভাবে হ্রাস পায় rad আমি সম্পূর্ণতার জন্য এই বিকল্পের তালিকা ( খেলার মাঠ ):

type Prepend<T, U extends any[]> = [T, ...U] // TS 4.0 variadic tuples

type Keys<T extends Record<string, any>> = Keys_<T, []>
type Keys_<T extends Record<string, any>, U extends PropertyKey[]> =
  {
    [P in keyof T]: {} extends Omit<T, P> ? [P] : Prepend<P, Keys_<Omit<T, P>, U>>
  }[keyof T]

const t1: Keys<IMyTable> = ["createdAt", "isDeleted", "id", "title"] // ✔

++-স্বয়ংক্রিয় সমাপ্তির সাথে +কোনও সহায়িকার ফাংশন --কর্মক্ষমতা নিয়ে ম্যানুয়াল টিপল করুন


বৈকল্পিক 4: কোড জেনারেটর / টিএস সংকলক এপিআই

ts-morph এখানে বেছে নেওয়া হয়েছে, কারণ এটি মূল TS সংকলক API এর একটি সহজ সরল মোড়কের বিকল্প । অবশ্যই, আপনি সরাসরি সংকলক এপিআইও ব্যবহার করতে পারেন। জেনারেটর কোডটি দেখুন:

// ./src/mybuildstep.ts
import {Project, VariableDeclarationKind, InterfaceDeclaration } from "ts-morph";

const project = new Project();
// source file with IMyTable interface
const sourceFile = project.addSourceFileAtPath("./src/IMyTable.ts"); 
// target file to write the keys string array to
const destFile = project.createSourceFile("./src/generated/IMyTable-keys.ts", "", {
  overwrite: true // overwrite if exists
}); 

function createKeys(node: InterfaceDeclaration) {
  const allKeys = node.getProperties().map(p => p.getName());
  destFile.addVariableStatement({
    declarationKind: VariableDeclarationKind.Const,
    declarations: [{
        name: "keys",
        initializer: writer =>
          writer.write(`${JSON.stringify(allKeys)} as const`)
    }]
  });
}

createKeys(sourceFile.getInterface("IMyTable")!);
destFile.saveSync(); // flush all changes and write to disk

আমরা এই ফাইলটি সংকলন ও চালনার পরে নিম্নলিখিত বিষয়বস্তু সহ tsc && node dist/mybuildstep.jsএকটি ফাইল ./src/generated/IMyTable-keys.tsউত্পন্ন হয়:

// ./src/generated/IMyTable-keys.ts
const keys = ["id","title","createdAt","isDeleted"] as const;

++একাধিক বৈশিষ্ট্যের জন্য স্বয়ংক্রিয়-উত্পন্ন উত্পাদনের সমাধানকে মাপার যোগ্য নয় +কোনও সহায়ক ফাংশন +দ্বিগুণ -অতিরিক্ত বিল্ড-স্টেপ -সংকলক API এর সাথে পরিচিতির প্রয়োজন


6

IMyTableইন্টারফেস হিসাবে সংজ্ঞায়িত করার পরিবর্তে , এটি একটি শ্রেণি হিসাবে সংজ্ঞায়িত করার চেষ্টা করুন। টাইপস্ক্রিপ্টে আপনি একটি ইন্টারফেসের মতো ক্লাস ব্যবহার করতে পারেন।

সুতরাং আপনার উদাহরণের জন্য, আপনার শ্রেণিটিকে এভাবে परिभाषित করুন / উত্পন্ন করুন:

export class IMyTable {
    constructor(
        public id = '',
        public title = '',
        public createdAt: Date = null,
        public isDeleted = false
    )
}

ইন্টারফেস হিসাবে এটি ব্যবহার করুন:

export class SomeTable implements IMyTable {
    ...
}

কীগুলি পান:

const keys = Object.keys(new IMyTable());

5

আপনাকে এমন একটি শ্রেণি তৈরি করতে হবে যা আপনার ইন্টারফেসটি কার্যকর করে, তা ইনস্ট্যান্ট করে এবং তারপরে Object.keys(yourObject)বৈশিষ্ট্যগুলি পেতে ব্যবহার করবে।

export class YourClass implements IMyTable {
    ...
}

তারপর

let yourObject:YourClass = new YourClass();
Object.keys(yourObject).forEach((...) => { ... });

আমার ক্ষেত্রে কাজ করে না, আমাকে ইন্টারফেসের সেই বৈশিষ্ট্যগুলি তালিকাবদ্ধ করতে হবে তবে আমি যা চাই তা তা নয়? ইন্টারফেসের নামটি গতিশীলভাবে আসে এবং তারপরে আমি এর বৈশিষ্ট্যগুলি নির্ধারণ করতে চাই
তুষার শুক্লা

এটি একটি ত্রুটি তৈরি করে (v2.8.3): Cannot extend an interface […]. Did you mean 'implements'?তবে এর implementsপরিবর্তে ব্যবহারের জন্য ম্যানুয়ালি ইন্টারফেসটি অনুলিপি করা দরকার, যা ঠিক আমি চাই না।
জ্যাকব

@ জ্যাকব দুঃখিত, এটি হওয়া উচিত ছিল implementsএবং আমি আমার উত্তর আপডেট করেছি। @ বাসারাত যেমন বলেছে, রানটাইমটিতে ইন্টারফেসের অস্তিত্ব নেই তাই এটি ক্লাস হিসাবে বাস্তবায়ন করার একমাত্র উপায়।
ড্যান ডিএফ

আপনি মানে কি ইন্টারফেসের পরিবর্তে কোনও ক্লাস ব্যবহার করবেন? দুর্ভাগ্যক্রমে আমি ইন্টারফেসটি তৃতীয় পক্ষের ( @types/react) থেকে আসা হিসাবে পারি না । আমি ম্যানুয়ালি এগুলি অনুলিপি করেছি, তবে এটি ভবিষ্যতের প্রমাণের সাথেই দৃly় হয় 😪 আমি নন-লাইফসাইকাল পদ্ধতিগুলি (যা ইতিমধ্যে আবদ্ধ) গতিশীলভাবে বাঁধতে চেষ্টা করছি, তবে সেগুলি রিএ্যাক্ট.কম্পোন্ট (শ্রেণি) তে ঘোষিত হয়নি।
জ্যাকব

না, আমার অর্থ এমন একটি শ্রেণি তৈরি করা যা আপনার তৃতীয় পক্ষের ইন্টারফেস প্রয়োগ করে এবং রানটাইমে সেই শ্রেণীর বৈশিষ্ট্যগুলি পেয়ে যায়।
ড্যান ডেফ

3

পারছে না। রানটাইমের সময় ইন্টারফেসের অস্তিত্ব নেই।

workaround

প্রকারের একটি ভেরিয়েবল তৈরি করুন এবং Object.keysএটিতে ব্যবহার করুন 🌹


4
আপনি কি এর অর্থ বলতে চাইছেন:var abc: IMyTable = {}; Object.keys(abc).forEach((key) => {console.log(key)});
তুষার শুক্ল

4
নাহ, কারণ সেই বস্তুর কোনও কী নেই। একটি ইন্টারফেস এমন একটি জিনিস যা টাইপসক্রিপ্টটি জাভাস্ক্রিপ্টে ব্যবহার করে তবে বাষ্পীভূত হয়, সুতরাং কোনও "প্রতিবিম্ব" বা "ছেদটি" জানাতে কোনও তথ্য অবশিষ্ট নেই। সমস্ত জাভাস্ক্রিপ্ট জানে যে একটি খালি অবজেক্ট আক্ষরিক আছে। আপনার একমাত্র প্রত্যাশা অপেক্ষা করা (বা অনুরোধ করুন ) টাইপস্ক্রিপ্টটিতে উত্স কোডে ইন্টারফেসের সমস্ত কী সহ একটি অ্যারে বা অবজেক্ট তৈরি করার উপায় অন্তর্ভুক্ত রয়েছে। অথবা, ড্যান ড্যাফ যেমন বলেছেন, আপনি যদি কোনও ক্লাস ব্যবহার করতে পারেন তবে আপনার প্রতিটি বৈশিষ্ট্যে বৈশিষ্ট্যের আকারে সংজ্ঞায়িত কীগুলি থাকবে ..
জেস্পার

17
এটি যদি কাজ করে না, তবে এই উত্তরে কেন আপোস্ট রয়েছে?
দাওজ

4
নিম্নতম কারণ: এটি উল্লেখযোগ্য মূল্যগুলির জন্য কাজ করে না বলে উল্লেখ করুন
TamusJRoyce

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

0

এটা ছিল শক্ত! আপনার সহায়তার জন্য সবাইকে ধন্যবাদ।

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

বিকল্প 2: টিএস সংকলক API (ts-morph) এর ভিত্তিতে কোড জেনারেটর

নোড মডিউল

npm install --save-dev ts-morph

key.ts

দ্রষ্টব্য : এটি ধরে নেয় যে সমস্ত ts ফাইলগুলি ./src এর মূলের মধ্যে অবস্থিত এবং কোনও সাবফোল্ডার নেই, সেই অনুসারে সামঞ্জস্য করুন

import {
  Project,
  VariableDeclarationKind,
  InterfaceDeclaration,
} from "ts-morph";

// initName is name of the interface file below the root, ./src is considered the root
const Keys = (intName: string): string[] => {
  const project = new Project();
  const sourceFile = project.addSourceFileAtPath(`./src/${intName}.ts`);
  const node = sourceFile.getInterface(intName)!;
  const allKeys = node.getProperties().map((p) => p.getName());

  return allKeys;
};

export default Keys;

ব্যবহার

import keys from "./keys";

const myKeys = keys("MyInterface") //ts file name without extension

console.log(myKeys)

-1

আপনি এটা করতে পারবেন না। রানটাইমের সময় ইন্টারফেসের অস্তিত্ব নেই (যেমন @ বাসারাত বলেছেন)।

এখন, আমি নিম্নলিখিতগুলি নিয়ে কাজ করছি:

const IMyTable_id = 'id';
const IMyTable_title = 'title';
const IMyTable_createdAt = 'createdAt';
const IMyTable_isDeleted = 'isDeleted';

export const IMyTable_keys = [
  IMyTable_id,
  IMyTable_title,
  IMyTable_createdAt,
  IMyTable_isDeleted,
];

export interface IMyTable {
  [IMyTable_id]: number;
  [IMyTable_title]: string;
  [IMyTable_createdAt]: Date;
  [IMyTable_isDeleted]: boolean;
}

কেবলমাত্র অনেকগুলি মডেল রয়েছে তা কল্পনা করুন এবং এটি সবার জন্য করুন ... এটি এত ব্যয়বহুল সময়।
উইলিয়াম কুয়েরো

-7
// declarations.d.ts
export interface IMyTable {
      id: number;
      title: string;
      createdAt: Date;
      isDeleted: boolean
}
declare var Tes: IMyTable;
// call in annother page
console.log(Tes.id);

4
টাইপস্ক্রিপ্ট সিনট্যাক্স রান-টাইমে উপলব্ধ না হওয়ায় এই কোডটি কাজ করবে না। আপনি যদি টাইপ স্ক্রিপ্ট খেলার মাঠে এই কোডটি পরীক্ষা করেন তবে আপনি খেয়াল করবেন যে জাভাস্ক্রিপ্টের সাথে console.log(Tes.id)সংকলিত একমাত্র জিনিসটি অবশ্যই অবশ্যই ত্রুটি হবে 'আনকচড রেফারেন্স এরিয়ার: টেস সংজ্ঞায়িত নয়'
তুষার শুক্ল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.