دریافت نوع ویژگی رابط تایپاسکریپت، با داشتن فقط نام ویژگی


من یک اینترفیس تایپاسکریپت با خواص زیاد دارم. بدون داشتن هیچ نمونهای از این اینترفیس، نیاز دارم نوع یک خاصیت داده شده را مشخص کنم.

export interface Data {
  foo: string;
  bar: number;
  .
  .
  .
}

این با استفاده از نمایه شاخص بر روی Data با یک رشته غیر متغیر ممکن است.

type propType = Data['foo']; // propType = 'string'

با این حال، این با استفاده از یک متغیر کار نمیکند.

const propName = 'foo';
type propType = Data[propName]; // Errors

خطاها :

  • نوع 'any' نمیتواند بهعنوان نوع اندیس استفاده شود. ts(2538)
  • ‘propName’ به یک مقدار اشاره دارد، اما در اینجا به عنوان یک نوع استفاده شده است. ts(2749)

هیچیک از این خطاها منطقی نیست، زیرا propName قطعاً یک string است نه any، و اینجا "به عنوان یک نوع استفاده نمیشود."

بهروزرسانی

همانطور که ممکن است واضح باشد، من سعی داشتم کاری غیرممکن انجام دهم. پس از مبارزههای فراوان، بالاخره پذیرفتهام که رابطهای بدون نمونه هیچ اطلاعاتی درباره ویژگیها یا نوع ویژگیها در زمان اجرا ندارند و هرگز نخواهند داشت.

این روش با استفاده از type کار خواهد کرد، اما تنها در زمان کامپایل. من پاسخ را با نحو صحیح تأیید کردم.

(با این حال هنوز فکر میکنم پیامهای خطا در سوال من عجیب هستند.)

پاسخ شماره ۱

شما دو راه حل دارید. یا

export interface Data {
  foo: string;
  bar: number;
}

type propName = 'bar';
type propType = Data[propName]; //number

یا

export interface Data {
  foo: string;
  bar: number;
}

const propName = 'bar'; //or let propName: 'bar' = 'bar' (both are type literals)
type propType = Data[typeof propName]; //number (typeof propName is 'bar')