টাইপস্ক্রিপ্টে শর্তসাপূর্ণ প্রকারগুলি


65

আমি ভাবছিলাম যে টাইপস্ক্রিপ্টে শর্তসাপূর্ণ টাইপ থাকতে পারি?

বর্তমানে আমার কাছে নিম্নলিখিত ইন্টারফেস রয়েছে:

interface ValidationResult {
  isValid: boolean;
  errorText?: string;
}

তবে আমি মুছে ফেলতে চাই errorTextএবং এটি কেবল যখন প্রয়োজনীয় সম্পত্তি হিসাবে isValidহয় havefalse

আমি আশা করি আমি এটি নিম্নলিখিত ইন্টারফেস হিসাবে লিখতে সক্ষম হয়েছি:

interface ValidationResult {
  isValid: true;
}

interface ValidationResult {
  isValid: false;
  errorText: string;
}

তবে আপনি জানেন, এটি সম্ভব নয়। তো, এই পরিস্থিতি সম্পর্কে আপনার ধারণা কী?


বুঝলাম না, যখন isValidহয় false?
নির্দিষ্ট পারফরম্যান্স

18
isValid তখন অপ্রয়োজনীয়। আপনারও ঠিক ত্রুটি পাঠ্য থাকতে পারে এবং এরপরে যদি ত্রুটি পাঠ্য নাল হয় তবে কোনও ত্রুটি নেই।
এমটিলস্টেড

হ্যাঁ, @ এম্টিল্টড, আপনি ঠিক বলেছেন তবে আমাদের লিগ্র্যাসি কোডের কারণে এটি আমাদের রাখতে হবে।
আরমান

উত্তর:


89

এই ধরণের লজিকের মডেল করার একটি উপায় হ'ল ইউনিয়নের ধরণটি ব্যবহার করা this

interface Valid {
  isValid: true
}

interface Invalid {
  isValid: false
  errorText: string
}

type ValidationResult = Valid | Invalid

const validate = (n: number): ValidationResult => {
  return n === 4 ? { isValid: true } : { isValid: false, errorText: "num is not 4" }
}

সংকলকটি বুলিয়ান পতাকার উপর ভিত্তি করে টাইপ ডাউন সরু করতে সক্ষম হয়

const getErrorTextIfPresent = (r: ValidationResult): string | null => {
  return r.isValid ? null : r.errorText
}

7
চমৎকার উত্তর. এবং আকর্ষণীয় যে সংকলক বলতে rপারে যে Invalidএখানে টাইপ করা আবশ্যক ।
sleske

1
একে বৈষম্যমূলক ইউনিয়ন বলা হয়। বেশ শীতল স্টাফ: typescriptlang.org/docs/handbook/...
Umur Kontacı

41

একাধিক ইন্টারফেস তৈরি করা এড়াতে যা কেবল তৃতীয়টি তৈরি করতে ব্যবহৃত হয়, আপনি তার typeপরিবর্তে সরাসরি বিকল্পও করতে পারেন :

type ValidationResult = {
    isValid: false;
    errorText: string;
} | {
    isValid: true;
};

20

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

type ValidationResult<IsValid extends boolean = boolean> = (IsValid extends true
    ? { isValid: IsValid; }
    : { isValid: IsValid; errorText: string; }
);


declare const validation: ValidationResult;
if (!validation.isValid) {
    validation.errorText;
}

এটি ValidationResult(যা প্রকৃতপক্ষে ValidationResult<boolean>ডিফল্ট প্যারামিটারের কারণে হয়) বাগের উত্তরে বা সার্টিফেরফর্মেন্সির উত্তরে উত্পাদিত ইউনিয়নের সমতুল্য এবং একই পদ্ধতিতে ব্যবহার করা যেতে পারে।

এখানে সুবিধাটি হ'ল আপনিও একটি পরিচিত ValidationResult<false>মানের কাছাকাছি যেতে পারতেন এবং তারপরে আপনাকে isValidএটি পরীক্ষা করতে হবে না কারণ এটি জানা ছিল falseএবংerrorString এটি অস্তিত্ব হিসাবে পরিচিত। সম্ভবত এই জাতীয় কেসের জন্য প্রয়োজনীয় নয় condition এবং শর্তসাপেক্ষিক প্রকারগুলি জটিল এবং ডিবাগ করা কঠিন হতে পারে, সুতরাং এগুলি সম্ভবত অযথা ব্যবহার করা উচিত নয়। তবে আপনি পারতেন এবং তা উল্লেখ করার মতো মনে হয়েছিল।


3
আমি নিশ্চিত যে এগুলি মাঝে মাঝে সত্যই সহায়ক। তবে, আমার কাছে সিনট্যাক্সটি দেখতে খুব বাজে।
পিলনরায়েজ

3
@ পিলনরয়েজ এহ, এটি অন্যান্য টাইপস্ক্রিপ্ট কোডিংয়ের সাথে ভাল ধারাবাহিকতা রয়েছে এবং extendsএটি সঠিক অপারেটর। এবং এটা অত্যন্ত শক্তিশালী হয়েছে, বিশেষ করে যেহেতু আপনার কাছে এটি ব্যবহার করতে পারেন ধরনের মধ্যে খনন করতে type SecondOf<T> = T extends Pair<any, infer U> ? U : never;
কেআরয়ান

@ কেআরয়ান আমি সে সম্পর্কে ভাবছিলাম। মূলত এর অর্থ কি SecondOf<number>'প্রসারিত' Pair<any, number>? আমার অনুমান "এখানে কোনও বই এর প্রচ্ছদ দ্বারা বিচার করবেন না" প্রথাটি এখানে প্রাসঙ্গিক।
পিলনরাইজ

@ পিলনরায়েজ আহ, না; বরং বিপরীত। SecondOf<Pair<any, number>>মূল্যায়ন numberSecondOf<number>কে মূল্যায়ন করে never, কারণ number extends Pair<any, infer U>এটি মিথ্যা, যেমন numberকোনও প্রসারিত হয় নাPair
কেআরিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.