Typescript泛型不适用于Readonly

Typescript泛型不适用于Readonly,typescript,Typescript,让我们在TypeScript中使用以下简化示例: type Foo={name:string}|未定义 功能fooWorks(输入:T){ 返回输入?.name//ok } 函数错误(输入:只读){ 返回输入?.name//错误 } 为什么fooWorks有效,而fooErrors无效?这似乎是类型别名的限制 interface Foo { name: string } function fooWorks<T extends Foo>(input?: T) { retu

让我们在TypeScript中使用以下简化示例:

type Foo={name:string}|未定义
功能fooWorks(输入:T){
返回输入?.name//ok
}
函数错误(输入:只读){
返回输入?.name//错误
}

为什么
fooWorks
有效,而
fooErrors
无效?

这似乎是类型别名的限制

interface Foo  { name: string }

function fooWorks<T extends Foo>(input?: T) {
    return input?.name // ok
}




function fooErrors<T extends Foo>(input?: Readonly<T>) {
    return input?.name // error
}
接口Foo{name:string}
函数fooWorks(输入?:T){
返回输入?.name//ok
}
函数错误(输入?:只读){
返回输入?.name//错误
}

行为符合预期。

它给出以下错误:

属性“name”在类型
上不存在,不可为null

问题是,TypeScript编译器不理解这里微妙的类型收缩,并抛出一个编译时错误(尽管,我不能100%确定这篇博客文章对您有多大帮助)

Foo
中删除
未定义的

type Foo = { name: string }

function fooWorks<T extends Foo>(input: T) {
    return input?.name
}

function fooErrors<T extends Foo>(input: Readonly<T>) {
    return input?.name
}

以下内容将根据需要保留
只读
类型和
未定义

function fooErrors<T extends Readonly<Foo>>(input: T) {
    return input?.name // works
}
函数错误(输入:T){
返回输入?.name//works
}
注意:我们在中设置了
Readonly
,并且没有将其环绕在参数类型周围

foorerrors(input:Readonly)
导致问题的原因是:TypeScript不会进一步处理未解析的泛型类型参数(如
T
)。从本质上讲,这是一个问题。因此,在函数体中,
input
具有类型
{readonly[P in keyof T]:T[P];}
,不幸的是,该类型不能分配回
T
及其约束
Foo
。从编译器的透视属性
name
中,无法再找到参数


不幸的是
{name?:string}
!=<代码>{name:string}|未定义。这是已知问题吗?
fooErrors(输入:Readonly)
不起作用。对不起,我稍微误读了类型。我已经更新了。这个问题很好地概括了已知的限制:我试图阅读链接,但是
5xx Oops!Medium发生了一些问题。
。重试,我觉得
不理解这里的微妙类型缩小,并在帖子中抛出编译时错误
引用了一些不同的内容:
过滤器
不会返回不同的类型。对于所描述的行为,很难找到一个可理解的解释(至少对我来说). 我一直在寻找。我无法更改代码,因为真正的代码在第三方库(react)中。(这只是一个非常简化的示例,用于演示。)您能提供一些指定/跟踪行为的参考或问题吗?是泛型没有被进一步解释的一个例子。另一个更突出的问题(后者侧重于缩小联盟范围)。那就是你的问题链接!
function fooErrors<T extends Readonly<Foo>>(input: T) {
    return input?.name // works
}