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"
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 , которые могут быть связаны.