gpt4 book ai didi

javascript - typescript :缩小 promise 的类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:38:39 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何根据参数在 promise 上使用类型保护。

function request({ logic }: { logic: boolean }) {
return new Promise((resolve, reject) => {
if (l)
resolve("something");
resolve(1);
});
}

request({ logic: true }).then(a => {
a.length
})

在这个例子中,我想确保 typeof 'a' == 'string'。我尝试在 request 中编写一些类型保护,但它们的结果丢失了。我不知道这是否只是 typescript 的限制,或者我只需要做一些智能类型转换或什么。

这是我实际尝试做的玩具示例,即进行异步调用,其结果根据某些参数略有不同。而且我不愿意创建另一个函数来覆盖更改后的返回类型

最佳答案

Typescript 函数重载来拯救:

function request(logic: true): Promise<string>;
function request(logic: false): Promise<number>;
function request(logic: boolean) {
return new Promise((resolve, reject) => {
if (logic)
resolve("something");
resolve(1);
});
}

request(true).then(a => {
console.log(a.length); //<-- knows that a is a string
});

request(false).then(a => {
console.log(a.length); //<-- error: prop 'length' does not exist on number
});

类型保护旨在用于 if 语句。

编辑

你会感到惊讶! Typescript 也支持基于字段的重载区分!检查以下代码:

function request(opts: { logic: true }): Promise<string>;
function request(opts: { logic: false }): Promise<number>;
function request(opts: { logic: boolean }) {
return new Promise((resolve, reject) => {
if (opts.logic)
resolve("something");
resolve(1);
});
}


request({ logic: true }).then(a => {
console.log(a.length); //<-- knows that a is a string
});

request({ logic: false }).then(a => {
console.log(a.length); //<-- error: prop length cannot be found on type number
});

编辑

通过一些通用魔法,您可以实现所需的行为。这样,从调用者的 Angular 来看,只有 logic 字段很重要。缺点是您甚至在 request 函数实现中对 opts.logic 进行了类型检查。

function request<T extends { logic: true }>(opts: T): Promise<string>;
function request<T extends { logic: false }>(opts: T): Promise<number>;
function request(opts: any) {
return new Promise((resolve, reject) => {
if (opts.logic)
resolve("something");
resolve(1);
console.log(opts.anything);
});
}

request({ logic: true, foo: 'bar' }).then(a => {
console.log(a.length); //<-- knows that a is a string
});

request({ logic: false, foo: 'baz' }).then(a => {
console.log(a.length); //<-- error: prop length cannot be found on type number
});

关于javascript - typescript :缩小 promise 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46302753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com