টাইপস্ক্রিপ্টে কোনও প্রকারকে নালযোগ্য হিসাবে কীভাবে ঘোষণা করবেন?


248

টাইপস্ক্রিপ্টে আমার একটি ইন্টারফেস রয়েছে।

interface Employee{
    id: number;
    name: string;
    salary: number;
}

আমি salaryএকটি ক্ষুদ্র ক্ষেত্র হিসাবে তৈরি করতে চাই (যেমন আমরা সি # তে করতে পারি)। এটি কি টাইপস্ক্রিপ্টে করা সম্ভব?

উত্তর:


276

জাভাস্ক্রিপ্টের সমস্ত ক্ষেত্রে (এবং টাইপস্ক্রিপ্টে) এর মান nullবা থাকতে পারে undefined

আপনি ক্ষেত্র করতে পারেন ঐচ্ছিক যা nullable থেকে আলাদা।

interface Employee1 {
    name: string;
    salary: number;
}

var a: Employee1 = { name: 'Bob', salary: 40000 }; // OK
var b: Employee1 = { name: 'Bob' }; // Not OK, you must have 'salary'
var c: Employee1 = { name: 'Bob', salary: undefined }; // OK
var d: Employee1 = { name: null, salary: undefined }; // OK

// OK
class SomeEmployeeA implements Employee1 {
    public name = 'Bob';
    public salary = 40000;
}

// Not OK: Must have 'salary'
class SomeEmployeeB implements Employee1 {
    public name: string;
}

তুলনা করা:

interface Employee2 {
    name: string;
    salary?: number;
}

var a: Employee2 = { name: 'Bob', salary: 40000 }; // OK
var b: Employee2 = { name: 'Bob' }; // OK
var c: Employee2 = { name: 'Bob', salary: undefined }; // OK
var d: Employee2 = { name: null, salary: 'bob' }; // Not OK, salary must be a number

// OK, but doesn't make too much sense
class SomeEmployeeA implements Employee2 {
    public name = 'Bob';
}

35
দেখে মনে হচ্ছে কঠোরভাবে বাতিলযোগ্য ধরণের এবং কঠোর নাল-চেকগুলি কার্যকর করা হয়েছে এবং টাইপস্ক্রিপ্ট ২.০ সহ উপস্থিত হবে! (বা typescript@nextএখন।)
mindplay.dk

আপনি প্রথম উদাহরণে var সি সম্পর্কে নিশ্চিত? আমার কাছে মনে হচ্ছে ভার বি এবং ভার সি একই রকম।
martinp999

সংকলন ত্রুটি ছাড়াই নাল বা অপরিজ্ঞাত মান সেট করতে, tsconfig "কঠোর" বিকল্পটি অবশ্যই সরানো বা "মিথ্যা" সমান হতে হবে"strict" : false
নিকোলাস জেনেল

1
এটি ভুল। জেএস নাল এবং অপরিজ্ঞাত মধ্যে পার্থক্য করে। সঠিক কোডটি হওয়া উচিত salary:number|null;যদি আপনি তা করেন তবে salary?:number; salary = null;একটি ত্রুটি পাবেন। তবে, salary = undefined;এক্ষেত্রে ঠিক কাজ করবে। সমাধান: ইউনিয়ন অর্থাৎ '|' ব্যবহার করুন
অঙ্কুর নিগম

125

ইউনিয়ন টাইপ এই ক্ষেত্রে আমার মনে সর্বোত্তম বিকল্প:

interface Employee{
   id: number;
   name: string;
   salary: number | null;
}

// Both cases are valid
let employe1: Employee = { id: 1, name: 'John', salary: 100 };
let employe2: Employee = { id: 1, name: 'John', salary: null };

সম্পাদনা করুন: এই কাজ হিসেবে প্রত্যাশিত জন্য, আপনি সক্ষম উচিত strictNullChecksমধ্যে tsconfig


9
আপনি যদি --strictNullChecks ব্যবহার করেন (যা আপনার উচিত) এটি একটি বৈধ সমাধান। আমি এটি alচ্ছিক সদস্যদের পক্ষে ব্যবহার করব না, যেহেতু এটি আপনাকে সমস্ত আক্ষরিক বস্তুর উপর একটি স্পষ্ট নাল যুক্ত করতে বাধ্য করে, তবে ফাংশন রিটার্ন মানগুলির জন্য, এটি যাওয়ার উপায়।
জিওন

78

আরও # সি লাইক হওয়ার জন্য এ জাতীয় ধরণটি নির্ধারণ করুন Nullable:

type Nullable<T> = T | null;

interface Employee{
   id: number;
   name: string;
   salary: Nullable<number>;
}

বোনাস:

Nullableটাইপসক্রিপ্ট টাইপের মতো বিল্টের মতো আচরণ করার জন্য , এটি global.d.tsমূল উত্স ফোল্ডারে একটি সংজ্ঞা ফাইলে সংজ্ঞায়িত করুন। এই পথটি আমার পক্ষে কাজ করেছিল:/src/global.d.ts


1
আমার প্রিয় উত্তর - এটিকে না পড়েই সরাসরি প্রশ্নের উত্তর দেয়।
Lqueryvg

1
এটি ব্যবহার করে অবজেক্টের বৈশিষ্ট্যগুলির স্বয়ংক্রিয় সমাপ্তি ভঙ্গ হয়। উদাহরণস্বরূপ, যদি আমাদের থাকে তবে আমরা emp: Partial<Employee>করতে পারি emp.idবা করতে পারি emp.nameতবে আমাদের যদি থাকে তবে emp: Nullable<Employee>আমরা করতে পারি নাemp.id
ইউসুফ খান

1
এটিই প্রশ্নের আসল উত্তর।
প্যাট্রিক

37

The ?চ্ছিক ক্ষেত্রে কেবল একটি প্রশ্ন চিহ্ন যুক্ত করুন ।

interface Employee{
   id: number;
   name: string;
   salary?: number;
}

54
রায়ান ইঙ্গিত হিসাবে ...? টাইপস্ক্রিপ্টে alচ্ছিক মানে নমনীয় নয়। ছাড়া ? এর অর্থ ভ্যার অবশ্যই নাল বা অপরিজ্ঞাত সহ কোনও মানতে সেট করা উচিত। সঙ্গে ? আপনি পুরো ঘোষণাটি বাদ দিতে পারেন thing
তিনি 11

3
ধন্যবাদ! আমি "টাইপসক্রিপ্ট alচ্ছিক মান" এর জন্য গুগল করেছিলাম তাই এটি আমি ঠিক যা খুঁজছিলাম।
ফেলো অচেনা লোক

13

আপনি কেবল নীচের মত একটি ব্যবহারকারী-সংজ্ঞায়িত প্রকার প্রয়োগ করতে পারেন:

type Nullable<T> = T | undefined | null;

var foo: Nullable<number> = 10; // ok
var bar: Nullable<number> = true; // type 'true' is not assignable to type 'Nullable<number>'
var baz: Nullable<number> = null; // ok

var arr1: Nullable<Array<number>> = [1,2]; // ok
var obj: Nullable<Object> = {}; // ok

 // Type 'number[]' is not assignable to type 'string[]'. 
 // Type 'number' is not assignable to type 'string'
var arr2: Nullable<Array<string>> = [1,2];


4

কিছুক্ষণ আগে আমার এই একই প্রশ্ন ছিল .. সমস্ত ধরণের টিএস হ'ল সংক্ষিপ্ত, কারণ শূন্যতা সমস্ত প্রকারের একটি উপপ্রকার (উদাহরণস্বরূপ, স্কেলা) এর বিপরীতে।

এই ফ্লোচার্টটি সাহায্য করে কিনা দেখুন - https://github.com/bcherny/language-tyype-compistance#typescript


2
-১: এটি মোটেও সত্য নয়। হিসাবে void'সব ধরনের উপপ্রকার' (হচ্ছে নীচে টাইপ ), পড়ুন এই থ্রেড । এছাড়াও স্কেলার জন্য আপনার সরবরাহ করা চার্টটিও ভুল। Nothingস্কেল ইন, আসলে, নীচের প্রকার। টাইপ করা বিষয়, এটিএম, নেই নীচে টাইপ করার সময় Scala আছে না
ড্যানিয়েল শিন

2
"সমস্ত ধরণের উপপ্রকার"! = নীচের প্রকার। টিএস স্পেসটি
TypeScript/

3

নুলযোগ্য টাইপ রানটাইম ত্রুটি ডেকে আনতে পারে। সুতরাং আমি মনে করি একটি সংকলক বিকল্প ব্যবহার করা --strictNullChecksএবং number | nullটাইপ হিসাবে ঘোষণা করা ভাল। নেস্টেড ক্রিয়াকলাপের ক্ষেত্রেও, যদিও ইনপুট প্রকারটি শূন্য, সংকলক এটি কী ভাঙ্গতে পারে তা জানতে পারে না, তাই আমি ব্যবহারের প্রস্তাব দিই !(বিস্মরণ চিহ্ন)।

function broken(name: string | null): string {
  function postfix(epithet: string) {
    return name.charAt(0) + '.  the ' + epithet; // error, 'name' is possibly null
  }
  name = name || "Bob";
  return postfix("great");
}

function fixed(name: string | null): string {
  function postfix(epithet: string) {
    return name!.charAt(0) + '.  the ' + epithet; // ok
  }
  name = name || "Bob";
  return postfix("great");
}

রেফারেন্স। https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-type-assertions

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