Скажем, у меня есть следующее
const client: Client | boolean = await db.connect()
if (client === false) {
return
}
await start(client)
db.connect() либо возвращает клиент (при успешном подключении), либо false (неудачное подключение).
start принимает только Client в качестве параметра:
const start = async (dbClient: Client): Promise<void> => {
Как вы, наверное, видите, я получаю сообщение об ошибке с await start(client):
Argument of type true | Client is not assignable to type Client
Я мог бы обойти это, указав тип Client | boolean в start, и быть в безопасности, зная, что он никогда не будет ложным, поскольку он возвращается раньше, чем вызывается start, и никогда не будет true, поскольку connect никогда не возвращает true, но это пахнет (и может вызвать дополнительные проблемы в будущем).
Каков наилучший способ/практика для такого рода вещей?
Вместо того, чтобы просто возвращать Client из connect, я мог бы вернуть объект
{
connected: boolean,
client: client,
}
Здесь это имеет больше смысла?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку вы знаете, что это может быть только Client или false, вы можете закодировать это как тип Client | false. Затем TypeScript достаточно умен, чтобы решить, что если вы исключите false, то останется Client.
type ClientResult = Client | false;
const client: ClientResult = await db.connect()
if (client === false) {
return
}
await start(client)
@CarlMarkham, какое объявление для функции db.connect()?
Если я удалю возвращаемый тип из метода connect, ваше решение сработает. Так что вместо async connect(): Promise<Client | boolean> { у меня теперь есть async connect() {
Это работает для меня как с объявлением для connect(), так и без него:
interface Client {
name: string
}
type ClientResult = Client | false
async function main() {
const client: ClientResult = await connect(Math.random() > 0.5)
if (client === false) {
return
}
await start(client)
}
async function start(client: Client) {}
async function connect(i?) {
return i ? { name: 'John' } : false
}
Какую версию TypeScript вы используете?
Если вы хотите пройти по пути сложного объекта, взгляните на npmjs.com/package/гетто-монада. Отказ от ответственности: я сам написал этот пакет, чтобы обеспечить нулевую безопасность в проекте, над которым я работал.
Я пробовал это, но получаю
Type 'boolean | Client' is not assignable to type 'ClientResult'с помощьюtype ClientResult = Client | falseconst client: ClientResult = await db.connect()