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 (
{/* Just works. */}
{typeof resource.mySpecificB === 'string' && {resource.mySpecificA}}
{/* Works only if exact objects are being used in all three types. */}
{resource.mySpecificA && {resource.mySpecificA}}
);
}
Теперь, если объект типа DescribableResource
имеет свойство mySpecificA
, ясно, что это тип ResourceA
.
Существует множество проблем при смешении пересечений с объединениями, например facebook / flow # 4029 или facebook / flow # 4247 , которые могут быть связаны.
При чтении документации SQLite Вы будете видеть, что она поддерживает многочисленные связи для чтения только, Вы не можете записать в базу данных от mulitple соединений, потому что она не разработана для этого.
Если Вы не используете, НАЧИНАЮТСЯ НЕПОСРЕДСТВЕННЫЙ для инициирования транзакций, Вы рискуете иметь необходимость откатывать и повторить их. НАЧИНАНИЕ не делает никакой блокировки; последующее ОБНОВЛЕНИЕ или INSERT получают блокировку, и необходимо проверить код результата, чтобы видеть, перестали ли они работать. Посмотрите эту страницу на транзакциях и этого на блокировках.