Tìm kiếm trang web

typescript - Yêu cầu decorator trong việc triển khai giao diện


Tôi đang muốn thực thi việc một số thành viên của một typescript interface yêu cầu có decorators trong phần triển khai của chúng.

Đây là giao diện ví dụ của tôi:

export interface InjectComponentDef<TComponent> {
  // TODO is it possible to make this only allow properties decorated with @Input()
  inputs: Partial<TComponent>, // & { @Input() [key: string]: any } my attempt to enforce decorator, invalid syntax 
  //... 
};

Mục tiêu của tôi là cung cấp lớp dưới đây, tôi muốn không cho phép thuộc tính notAnInput được bao gồm trong việc triển khai InjectComponentDef.inputs

export class MyComponent {
   public @Input() isAnInput: string;
   public notAnInput: string;
}
...
let x:InputComponentDef<MyComponent>=
{
    inputs: {
        isAnInput:'all good',
        notAnInput:'no good', // I want this to throw a compile time error because it is not decorated with @Input
    }
}

Có cách nào để thực hiện việc này trong TypeScript vào thời gian biên dịch không?

Câu trả lời #1

Từ tài liệu TS:

Biểu thức cho decorator lớp sẽ được gọi như một hàm tại thời gian chạy, với hàm khởi tạo của lớp được trang trí làm đối số duy nhất của nó.

Và :

[chúng] đánh giá thành một hàm sẽ được gọi tại thời gian chạy với thông tin về khai báo đã được trang trí.

Nghe có vẻ như các decorator không nên được sử dụng tại thời điểm biên dịch chút nào. Vì vậy, ngay cả khi nó hoạt động bằng một số giải pháp thay thế, cách tiếp cận này có thể không đúng về mặt thiết kế.

Tóm lại, trường hợp sử dụng của bạn trông giống như điều mà bạn thực sự không thể phát hiện tại thời điểm biên dịch.

Một điều cần suy nghĩ: tại sao bạn lại cần phải bắt buộc @Input() ngay từ đầu? Hãy nghĩ về một đối tượng con tự thiết lập dữ liệu cho notAnInput, điều đó có thể hoàn toàn hợp lệ tùy thuộc vào trường hợp sử dụng của bạn.