Tìm kiếm trang web

Làm thế nào để tôi thực hiện tương đương của dynamic cast trong C++ bằng TypeScript?


Trong C++ có dynamic cast kiểm tra tại thời gian chạy xem một đối tượng có triển khai một giao diện hay không và trả về nullptr thay vì đối tượng nếu nó không triển khai.

Làm thế nào tôi có thể làm cùng một việc trong TypeScript. Cách mà tôi có thể nghĩ đến là kiểm tra sự tồn tại và kiểu của từng thuộc tính:

interface MyInterface {
    value: string;
    lastUpdated: number;
    deleted: boolean;
}

let obj = JSON.parse(inputdata);

if ('value' in obj && 'lastUpdated' in obj && 'deleted' in obj && typeof obj.value === 'string' && obj.lastUpdated === 'number' && obj.deleted === 'boolean') {
    // do something
} else {
    // null case
}

Vì các giao diện TypeScript không có sẵn tại thời gian chạy, tôi thậm chí không thể viết các hàm trợ giúp để tổng quát hóa những kiểm tra này.

Có cách nào tốt hơn để thực hiện dynamic casts trong TypeScript không?

Câu trả lời #1

Tôi tin rằng bạn sẽ nhận được những gì bạn đang yêu cầu nếu bạn thực hiện một bộ bảo vệ kiểu

interface MyInterface {
    value: string;
    lastUpdated: number;
    deleted: boolean;
}

function isMyInterface(obj: any): obj is MyInterface {
  // You don't really need the first three, just the last three
  return 'value' in obj &&
         'lastUpdated' in obj &&
         'deleted' in obj &&
         typeof obj.value === 'string' &&
         typeof obj.lastUpdated === 'number' &&
         typeof obj.deleted === 'boolean';
}

let obj = JSON.parse(inputdata);

if (isMyInterface(obj)) {
    // do something, compiler knows obj is a MyInterface in this block
} else {
    // null case
}

Bài viết liên quan