Как смешать объединение и пересечение типов аннотаций потока?

var loc = window.location;  // => "http://example.com:3000/pathname/?search=test#hash"

возвращает currentUrl.

Если вы хотите передать свою собственную строку в качестве URL-адреса ( не работает в IE11 ):

var loc = new URL("http://example.com:3000/pathname/?search=test#hash")

Затем вы можете разобрать его так:

loc.protocol; // => "http:"
loc.host;     // => "example.com:3000"
loc.hostname; // => "example.com"
loc.port;     // => "3000"
loc.pathname; // => "/pathname/"
loc.hash;     // => "#hash"
loc.search;   // => "?search=test"
1
задан Rory O'Kane 17 January 2019 в 13:33
поделиться

1 ответ

1111 Это не сработает, потому что это небезопасно. Тип Base может иметь свойство mySpecificA, поскольку оно не ограничено этими тремя свойствами (обратите внимание на разницу между {...} и {|...|}). Чтобы позволить Flow действительно проверить, есть ли у ключа resource данный ключ, вы должны как-то различать эти два типа. Например, ограничьте возможные свойства, используя распространение вместо пересечения:

// Most of the non-changed parts are skipped.

type Base = {
  version: string,
  name: string,
  year: number
};

type ResourceA = {
  ...Base,
  mySpecificA: string
};

type ResourceB = {
  ...Base,
  mySpecificB: string
};

function ResourceDescriptor({ resource }: Props) {
  return (
    <div>
      {/* Just works. */}
      {typeof resource.mySpecificB === 'string' && <div>{resource.mySpecificA}</div>}

      {/* Works only if exact objects are being used in all three types. */}
      {resource.mySpecificA && <div>{resource.mySpecificA}</div>}
    </div>
  );
}

Теперь, если объект типа DescribableResource имеет свойство mySpecificA, ясно, что это тип ResourceA.

Существует множество проблем при смешении пересечений с объединениями, например facebook / flow # 4029 или facebook / flow # 4247 , которые могут быть связаны.

0
ответ дан Radosław Miernik 17 January 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: