Как отправлять уведомления на устройства с помощью облачных функций Firebase?

Причиной этого является назначение типа пересечения его базовым типам.

В качестве типа пересечения Examples назначается ExampleA. ExampleA присваивается { [key: string]: string }. Поэтому Examples должен быть назначен для параметра параметра функции

. Это может быть показано в этом коде:

const bar: Examples = { a: 'foo', b: 1, c: false }; 
const bar2: ExampleA = bar;
const bar3: { [key: string]: string } = bar2;
foo(bar3); //This works
foo(bar2); //Since the assignment bar3 = bar2 works, this must work, too
foo(bar); //Since the assignment bar2 = bar works, this must work, too

Вариант игровой площадки


UPDATE

Поведение является следствием, когда вы хотите придерживаться принципа «когда A назначается B и B назначается C, то A должен быть отнесенным к С ". У системы типов нет другого выбора, кроме как позволить этим типам назначений. Однако на самом деле является другой проблемой при передаче значения в качестве параметра в foo.

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

let item: { a: string, b: number } = { a: "Hello World!", b: 1 };
let partiallyMatchingItem: { a: string } = item;

Совершенно не проблема, что partiallyMatchingItem имеет больше свойств, чем фактически объявлено в типе. Гарантия является минимальной гарантией.

Однако присвоение отображаемому типу не работает, поскольку дополнительный член item типа number:

let item = { a: "Hello World!", b: 1 };
let mappedTypeItem: { [key: string]: string } = item; //Error

So гарантом на этот раз является не минимальная гарантия, это абсолютная гарантия. И это довольно смешно, когда вы рассматриваете, как легко вы можете обойти это (намеренно или случайно):

let item = { a: "Hello World!", b: 1 };
let partiallyMatchingItem: { a: string } = item;
let mappedTypeItem: { [key: string]: string } = partiallyMatchingItem;

Или просто:

let item = { a: "Hello World!", b: 1 };
let mappedTypeItem: { [key: string]: string } = item as { a: string };

Это ошибка, ожидающая что произойдет, особенно когда вы перечисляете свойства mappedTypeItem, и считаете, что значения всех свойств являются string.

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

Чистым решением было бы сделать значения «обычных» типов не , назначаемых сопоставленным типам (если в обратном порядке требуется совместимость, вы можете переключить его с помощью переключателя в файле tsconfig.json). По крайней мере, вы, вероятно, должны избегать таких назначений, поскольку безопасность типов, предоставляемая здесь, довольно слаба.

1
задан Jon Doe 19 January 2019 в 14:59
поделиться

1 ответ

Чтобы иметь возможность отправлять уведомления определенной группе пользователей с помощью Firebase, вы можете написать функцию javascript, которая будет прослушивать некоторые события, запускающие вашу базу данных. Когда эти события запускаются, вы можете выполнить операцию, в этом случае, вам нужно будет написать функцию javascript (или typcript), которая может найти маркер устройства для отправки уведомления и полезную нагрузку уведомления, в этом примере очень ясно, как это сделать, и его часть из коллекции примеров функций в функциях Firebase репо

https://github.com/firebase/functions-samples/tree/Node-8/fcm-notifications

0
ответ дан Gastón Saillén 19 January 2019 в 14:59
поделиться
Другие вопросы по тегам:

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