gpt4 book ai didi

typescript - Typescript 推断的对象字面量类型扩展是如何工作的?

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

我读过 typescript 如何加宽 inferred types但我仍然不确定发生了什么here :

type Def = {
'T': { status: 5, data: {r: 'm'}},
}

function route<S extends keyof Def>
(route: S, handler: () => Promise<Def[S]>) { }

route('T', async function () {
return { status: 5, data: {r: 'm'} };
});

这在 Typescript Playground 上工作正常,但不应该引发错误,因为 Typescript 将 route() 的第二个参数的类型推断为 () => {status:数字,数据:{r: string}}?

我问是因为我对 this code 有疑问.传入 Router::get 的函数被推断为 () => {status: number} 而不是 () => {status: 200}。奇怪的是,当我删除 POST 路由 ( shown here ) 时没有出现错误。

最佳答案

这个简单的示例确实按预期工作,并且此处没有发生文字类型扩展 - 函数 route()是通用的,S首先推断,因为您在调用它时未指定其泛型类型参数 S :

route('T', async function () {
return { status: 5, data: {r: 'm'} };
});

所以,首先,编译器必须推断出 S来自传递的实际参数的类型。

通过查看第一个参数,字面量 'T' , 它确定 S为文字类型 'T' .

第二个参数的返回类型,() => Promise<Def[S]>固定为定义为 Def['T'] 的对象文字类型.然后编译器不需要推断异步函数的返回类型,它只是检查它是否符合 Def['T'] (确实如此)。

为什么这不起作用 in this, more complex code我不知道,但我怀疑 ApiDefBase 中的索引签名防止类型推断对 Path 的影响- 如果您将类似的索引签名添加到简单示例中,您将开始遇到相同的错误:

type DefBase = { [p in string]: {}}

interface Def extends DefBase {
'T': { status: 5, data: {r: 'm'}},
}

function route<S extends keyof Def>
(route: S, handler: () => Promise<Def[S]>) { }

route('T', async function () {
return { status: 5, data: {r: 'm'} };
});

Argument of type '() => Promise<{ status: number; data: { r: string; }; }>' is not assignable to parameter of type '() => Promise<{ status: 5; data: { r: "m"; }; }>'.
Type 'Promise<{ status: number; data: { r: string; }; }>' is not assignable to type 'Promise<{ status: 5; data: { r: "m"; }; }>'.
Type '{ status: number; data: { r: string; }; }' is not assignable to type '{ status: 5; data: { r: "m"; }; }'.
Types of property 'status' are incompatible.
Type 'number' is not assignable to type '5'.

现在,为什么添加索引签名会对类型推断产生这种影响——我不知道。

关于typescript - Typescript 推断的对象字面量类型扩展是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51452980/

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