تعریف آرایه در تایپ اسکریپت

هنگامی که می‌خواهیم یک تایپ آرایه در تایپ اسکریپت تعریف کنیم می‌توانیم از دو روش استفاده نماییم:

Array<T>
Array<T>و یا
T[]
T[]. در این مقاله قصد داریم تا این دو روش را باهم مقایسه کنیم.

مقایسه از نظر عملکرد

در این موقعیت‌ها توسعه‌دهندگان استدلال سینتکسی را دوست دارند، به خصوص زمانی که تفاوت عملکردی کمی بین این دو گزینه وجود دارد.

Array<T>
Array<T> و
T[]
T[]به غیر از یک مورد بسیار کوچک، کاملا یکسان رفتار می‌کنند.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type Test1 = [...Array<string>, ...Array<string>];
type Test2 = [...string[], ...string[]];
A rest element cannot follow another rest element.
type Test1 = [...Array<string>, ...Array<string>]; type Test2 = [...string[], ...string[]]; A rest element cannot follow another rest element.
type Test1 = [...Array<string>, ...Array<string>];
 
type Test2 = [...string[], ...string[]];
A rest element cannot follow another rest element.

در این مثال، هنگامی که تلاش می‌کنیم از سینتکس

T[]
T[]در حالت rest استفاده کنیم، با خطا مواجه می‌شویم. اما با توجه به مستندات موجود، این موضوع ممکن است در آینده برطرف شود. بنابراین می‌توانیم این دو را از نظر عملکردی یکسان در نظر بگیریم.

Keyof

اگر بخواهیم در مورد سینتکسی که می‌خواهیم استفاده کنیم قضاوت درستی داشته باشیم، باید عملگر

keyof
keyofرا در نظر بگیریم. استفاده از
keyof
keyofهمراه با
T[]
T[]می‌تواند منجر به نتایج غیرمنتظره شود.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type Person = {
id: string;
name: string;
};
const result: keyof Person[] = ["id", "name"];
Type 'string[]' is not assignable to type 'keyof Person[]'.
type Person = { id: string; name: string; }; const result: keyof Person[] = ["id", "name"]; Type 'string[]' is not assignable to type 'keyof Person[]'.
type Person = {
  id: string;
  name: string;
};
 
const result: keyof Person[] = ["id", "name"];
Type 'string[]' is not assignable to type 'keyof Person[]'.

ما در ان مثال ممکن است فکر کنیم که

keyof Person
keyof Personقبل از اینکه وارد اپراتور
[]
[]شود، بررسی می‌شود. به این معنی که ما در نهایت با یک تایپ مانند
('id' | 'name')[]
('id' | 'name')[]مواجه می‌شویم. اما متأسفانه، ابتدا
[]
[]بررسی می‌شود، بنابراین در نهایت یک
keyof
keyofروی
Person[]
Person[]انجام می‌دهیم.

برای این که این مشکل را برطرف کنیم، می‌توانیم

keyof Person
keyof Personرا داخل پرانتز قرار دهیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const result: (keyof Person)[] = ["id", "name"];
const result: (keyof Person)[] = ["id", "name"];
const result: (keyof Person)[] = ["id", "name"];

و یا این که می‌توانیم به جای آن از

Array<T>
Array<T>استفاده کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const result: Array<keyof Person> =
const result: (keyof Person)[]
["id", "name"];
const result: Array<keyof Person> = const result: (keyof Person)[] ["id", "name"];
const result: Array<keyof Person> =
        
const result: (keyof Person)[]
  ["id", "name"];

خوانایی

برخی توسعه‌دهندگان بر این باورند که

Array<string>
Array<string>خواناتر از
string[]
string[]است. در این بخش مقاله مقاله قصد داریم تا این موضوع را بررسی کنیم.

آرایه‌های Readonly

اگر بخواهیم با

Array<T>
Array<T>سازگار بمانیم، احتمالاً باید از تایپ
ReadonlyArray<T>
ReadonlyArray<T>نیز استفاده کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const array: ReadonlyArray<string> = ["hello", "world"];
array.push("foo");
Property 'push' does not exist on type 'readonly string[]'.
const array: ReadonlyArray<string> = ["hello", "world"]; array.push("foo"); Property 'push' does not exist on type 'readonly string[]'.
const array: ReadonlyArray<string> = ["hello", "world"];
 
array.push("foo");
Property 'push' does not exist on type 'readonly string[]'.

می‌توانیم این موضوع را با سینتکس

readonly T[]
readonly T[]مقایسه کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const array2: readonly string[] = ["hello", "world"];
array2.push("foo");
Property 'push' does not exist on type 'readonly string[]'.
const array2: readonly string[] = ["hello", "world"]; array2.push("foo"); Property 'push' does not exist on type 'readonly string[]'.
const array2: readonly string[] = ["hello", "world"];
 
array2.push("foo");
Property 'push' does not exist on type 'readonly string[]'.

آرایه‌هایی از آرایه‌ها

برای مدیریت آرایه‌هایی از آرایه‌ها، باید

Array<Array<T>>
Array<Array<T>>را نیز در نظر بگیریم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const array: Array<Array<string>> = [
["hello", "world"],
["foo", "bar"],
];
const array: Array<Array<string>> = [ ["hello", "world"], ["foo", "bar"], ];
const array: Array<Array<string>> = [
  ["hello", "world"],
  ["foo", "bar"],
];

می‌توانیم آن را با سینتکس

T[][]
T[][]مقایسه کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const array2: string[][] = [
["hello", "world"],
["foo", "bar"],
];
const array2: string[][] = [ ["hello", "world"], ["foo", "bar"], ];
const array2: string[][] = [
  ["hello", "world"],
  ["foo", "bar"],
];

موارد استفاده از
T[]
T[]
 در تایپ اسکریپت

تایپ اسکریپت نظری را که ترجیح می‌دهد ارائه می‌نماید. به این ترتیب، همیشه در نمایش hoverها و خطاها، از سینتکس

T[]
T[]استفاده می‌کند.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const array = [1, 2];
const array: number[]
const asConstArray = [1, 2] as const;
const asConstArray: readonly [1, 2]
const arrayOfArrays = [
const arrayOfArrays: number[][]
[۱, ۲],
[۳, ۴],
];
const stringArray = ["hello", "world"];
const numArray: number[] = stringArray;
Type 'string[]' is not assignable to type 'number[]'.
Type 'string' is not assignable to type 'number'.
const array = [1, 2]; const array: number[] const asConstArray = [1, 2] as const; const asConstArray: readonly [1, 2] const arrayOfArrays = [ const arrayOfArrays: number[][] [۱, ۲], [۳, ۴], ]; const stringArray = ["hello", "world"]; const numArray: number[] = stringArray; Type 'string[]' is not assignable to type 'number[]'. Type 'string' is not assignable to type 'number'.
const array = [1, 2];
       
const array: number[]
 
const asConstArray = [1, 2] as const;
           
const asConstArray: readonly [1, 2]
 
const arrayOfArrays = [
           
const arrayOfArrays: number[][]
  [۱, ۲],
  [۳, ۴],
];
 
const stringArray = ["hello", "world"];
 
const numArray: number[] = stringArray;
Type 'string[]' is not assignable to type 'number[]'.
  Type 'string' is not assignable to type 'number'.

این به این معنی است که اگر از

Array<T>
Array<T>در کد خود استفاده می‌کنیم، توسعه‌دهندگان تایپ اسکریپتی که تجربه کم‌تری دارند، ممکن است هنگام ترجمه بین دو این سینتکس کمی دچار ابهام شوند.

این موضوع می‌تواند دلیلی باشد که استفاده از

T[]
T[]را به استفاده از
Array<T>
Array<T>ترجیح دهیم.

جمع‌بندی

در این مقاله سعی کردیم تا روش‌های تعریف آرایه در تایپ اسکریپت را باهم بررسی کنیم که به طور خلاصه، به نتایج زیر رسیدیم:

  • Array<T>
    Array<T>و
    T[]
    T[]هر دو از نظر عملکردی که در کد دارند، یکسان هستند.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const firstTest = (arr: Array<string>) => {};
const secondTest = (arr: string[]) => {};
// Both behave the same!
firstTest(["hello", "world"]);
secondTest(["hello", "world"]);
const firstTest = (arr: Array<string>) => {}; const secondTest = (arr: string[]) => {}; // Both behave the same! firstTest(["hello", "world"]); secondTest(["hello", "world"]);
const firstTest = (arr: Array<string>) => {};
 
const secondTest = (arr: string[]) => {};
 
// Both behave the same!
firstTest(["hello", "world"]);
secondTest(["hello", "world"]);
  • استفاده از
    keyof
    keyofهمراه با
    T[]
    T[]می‌تواند منجر به نتایج غیرمنتظره شود.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type Person = {
id: string;
name: string;
};
const result: keyof Person[] = ["id", "name"];
Type 'string[]' is not assignable to type 'keyof Person[]'.
type Person = { id: string; name: string; }; const result: keyof Person[] = ["id", "name"]; Type 'string[]' is not assignable to type 'keyof Person[]'.
type Person = {
  id: string;
  name: string;
};
 
const result: keyof Person[] = ["id", "name"];
Type 'string[]' is not assignable to type 'keyof Person[]'.

برای برطرف کردن این مشکل باید به جای

T[]
T[]از
Array<T>
Array<T>استفاده کنیم.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const result: Array<keyof Person> = ["id", "name"];
const result: Array<keyof Person> = ["id", "name"];
const result: Array<keyof Person> = ["id", "name"];
  • برخی توسعه‌دهندگان بر این باورند که
    Array<string>
    Array<string>خواناتر از
    string[]
    string[]است. اما این موضوع مانند تفاوت بین “array of strings” یا “string array” می‌تواند یک موضوع شخصی بوده و فرد به فرد متفاوت باشد.
  • تایپ اسکریپت برای نمایش hoverها یا خطاها، از سینتکس
    T[]
    T[]استفاده می‌کند. توسعه‌دهندگان تایپ اسکریپتی که تجربه کمی دارند ممکن است هنگام ترجمه بین
    Array<T>
    Array<T>در کد و
    T[]
    T[]در خطاهای خود دچار ابهام شوند.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const array = [1, 2];
const array: number[]
const array = [1, 2]; const array: number[]
const array = [1, 2];
       
const array: number[]

دیدگاه‌ها:

افزودن دیدگاه جدید