آیا میتوانم یک نوع TypeScript را بهعنوان تمام مقادیر ممکن که از typeof حاصل میشوند تعریف کنم؟


من به دنبال تعریف یک نوع به عنوان تمامی مقادیر ممکن که از استفاده از عملگر typeof روی چیزی به دست میآیند، هستم.

در اصل، من به دنبال راهی سریعتر برای انجام این کار هستم، بدون هیچ نوع تابع یا متغیر میانی.

function getTypeOf(value: any) {
  return typeof value;
}

type T0 = ReturnType<typeof getTypeOf>; // "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"

چگونه میتوانم TypeScript را وادار کنم تا همان نوع T0 ("string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function") را بدون استفاده از یک تابع یا متغیر میانی که وجود آن تنها به منظور کمک به تولید این نوع است، ایجاد کند؟

توجه: در حال حاضر این کاربرد عملی زیادی ندارد، من فقط کنجکاوم که آیا این ممکن است.

پاسخ شماره ۱

این کار میکند و کمی کوتاهتر از کار شماست:

const uselessVariable = typeof (1 as any);

// type Test = "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"
type Test = typeof uselessVariable;

متاسفانه به نظر میرسد هیچ راهی برای انجام این کار بدون ایجاد یک متغیر واسطه بیفایده وجود ندارد؛ چیزی شبیه type Test=typeof typeof (1 as any) سادهتر بود اما مجاز نیست:

تایپاسکریپت عمداً نوع عباراتی که میتوانید از typeof روی آنها استفاده کنید را محدود میکند.

به طور خاص، استفاده از typeof تنها روی شناسهها (یعنی نامهای متغیر) یا ویژگیهای آنها قانونی است.

پس استفاده از typeof در یک زمینه نوع، به جز زمانی که با یک شناسه دنبال شود، یک خطای نحوی است. این بدان معناست که واقعاً لازم است یک شناسه (در دنیای جاوااسکریپت) اعلام شود تا بتوانید نوع مورد نظر خود را به صورت برنامهنویسی ساخته کنید.

لینک زمین بازی