Путаница в типах пересечений со строгой проверкой типов в скрипте типов - PullRequest
0 голосов
/ 19 декабря 2018

Этот вопрос в конечном счете связан с T & U и с тем, что делает пересечение типов.

Использует ли он конструктор T или U?Или ни то, ни другое?Это класс или интерфейс?Могу ли я по-прежнему создавать новые T & U объекты с помощью конструктора?Будет ли экземпляр работать?Если T & U имеет разные свойства, каждое из которых является обязательным, как мне создать новый объект T & U?Вот почему я спрашиваю об этом, большое спасибо.

У меня есть google.maps.Marker.Я хотел добавить свойство id к нему со строгой проверкой типов.Я подумал, что лучшим способом было бы расширить класс.Но проблема в том, что google.maps.Marker не загружается при расширении класса, что приводит к ошибке.Смотрите тему здесь .

Итак, я сделал там то, что было рекомендовано:

type IdMarker = google.maps.Marker & { id: string };

Это работает довольно хорошо.Итак, сначала я попытался создать новый idMarker из маркера, но он не скомпилировался из-за того, что у маркера нет свойства id.Я пытался добавить идентификатор при назначении маркера с помощью оператора распространения, но это не сработало.Поэтому я сделал id необязательным id? в вышеприведенном определении, и я мог бы присвоить свой idMarker: IdMarker = marker, а затем добавить свойство id.

Но я хочу, чтобы id был обязательным.Так что теперь у меня есть это:

const tempMarker: any = new google.maps.Marker(options);
tempMarker.id = markerData.id;
const marker: IdMarker = tempMarker;
marker.id = markerData.id;

И это работает для меня, но мне это не очень нравится.

1 Ответ

0 голосов
/ 19 декабря 2018

И это работает для меня, но мне это не очень нравится.

Создайте утилиту, например

export class Marker {
  constructor(public options: number) { }
}

export type IdMarker = Marker & { id: string };

export function createIdMarker(options: number, id: string) {
  const marker = new Marker(options) as IdMarker;
  marker.id = id; 
  return marker;
}

Теория

Возможно, вы слышали if a tree falls in the forest does it make a sound.Есть похожее программирование, говорящее if a function does mutation internally but pure in terms of all its arguments and return value, is it pure?.

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

Подробнее

Поскольку вы используете экземпляры , вы не можете распространять (...), но если это был объект, состоящий только из допустимых литералов json, вы можете использовать его, например:

type Marker = { something: number }
type IdMarker = Marker & { id: string }

const idMarker: IdMarker = {
  ...{ something: 123 },
  ...{ id: 'foo' }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...