Ошибка присваивания типа компилятора Typescript игнорируется - PullRequest
0 голосов
/ 24 октября 2018

У меня следующий сценарий:

const customer = new Customer();
let customerViewModel = new CustomerLayoutViewModel();

customerViewModel = customer;

Это не приводит к ошибке при компиляции, что, на мой взгляд, является неправильным поведением.Похоже, это связано с тем, что Customer и CustomerLayoutViewModel полностью идентичны.

Проблема в том, что со временем они не будут идентичны, и я хочу, чтобы приведенный выше код выдавал ошибку компиляции, потому чтотипы разные.

Итак, мой вопрос: как настроить компилятор для выдачи ошибки в приведенном выше примере?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Typescript использует структурную типизацию при определении совместимости типов.Это означает, что если два типа имеют совместимую структуру, они будут совместимы:

class Customer { name: string }
class CustomerLayoutViewModel { name: string }
const customer = new Customer();
let customerViewModel = new CustomerLayoutViewModel();
customerViewModel = customer; // OK compatible

Если Customer имеет дополнительные свойства, типы все еще совместимы, нет никаких шансов, что кто-то получит доступ через customerViewModel что-тоэтого нет:

class Customer { name: string; fullName: string }
class CustomerLayoutViewModel { name: string }
const customer = new Customer();
let customerViewModel = new CustomerLayoutViewModel();
customerViewModel = customer; // still OK compatible

Вы получите ошибки совместимости, если CustomerLayoutViewModel имеет дополнительные обязательные свойства:

class Customer { name: string }
class CustomerLayoutViewModel { name: string; fullName: string }
const customer = new Customer();
let customerViewModel = new CustomerLayoutViewModel();
customerViewModel = customer; //error now

Единственный способ убедиться, что типы несовместимы, это добавитьличное поле для класса.закрытые поля не будут совместимы с любым другим полем в любом другом событии класса, если имя совпадает:

class Customer { private x: string }
class CustomerLayoutViewModel { private x: string }
const customer = new Customer();
let customerViewModel = new CustomerLayoutViewModel();
customerViewModel = customer; //error Types have separate declarations of a private property 'x'. 
0 голосов
/ 24 октября 2018

Это не приведет к ошибке компиляции, поскольку вы не указали тип customer или customerViewModel, но если вы сделаете что-то подобное, вы получите ошибку времени компиляции:

const customer:Customer = new Customer();
let customerViewModel:CustomerLayoutViewModel = new CustomerLayoutViewModel();

customerViewModel  = customer;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...