Typescript 什么';这两个键类型参数声明之间的区别是什么?

Typescript 什么';这两个键类型参数声明之间的区别是什么?,typescript,inheritance,typescript-generics,keyof,Typescript,Inheritance,Typescript Generics,Keyof,在使用某种已知状态的通用包装器时,我在将子对象强制转换为其父对象时遇到了不兼容的类型错误。这种想法是,如果番茄扩展了水果,那么包装作为包装应该起作用 接口包装器{ //下一行是正确的 mergeWith(合并:(key:K)=>any):无效; update(updater:(value:TProps[K])=>any:void; } 接口中断器{ //不知何故,下一行似乎与上面的相同 mergeWith(合并:(key:keyof TProps)=>any):无效; update(update

在使用某种已知状态的通用包装器时,我在将子对象强制转换为其父对象时遇到了不兼容的类型错误。这种想法是,如果
番茄
扩展了
水果
,那么
包装
作为
包装
应该起作用

接口包装器{
//下一行是正确的
mergeWith(合并:(key:K)=>any):无效;
update(updater:(value:TProps[K])=>any:void;
}
接口中断器{
//不知何故,下一行似乎与上面的相同
mergeWith(合并:(key:keyof TProps)=>any):无效;
update(updater:(value:TProps[K])=>any:void;
}

这最终将成为一个棘手的问题。我应该能够调用
brokenFruit.mergeWith((x:“seeds”)=>0)
,其中回调要求其参数为字符串文本
“seeds”
。但是一个值
brokenTomato.mergeWith((x:“种子”)=>0)
是一个错误;它的回调必须接受
“seeds”
“color”
参数。由于我不能用
brokenTomato
代替
brokenFruit
,这意味着
brokenTomato
不是
brokenFruit
。感谢您对jcalz的评论。我很感激你说出问题的类别。关于错误代码和非错误代码之间的区别,我的结论是否应该是使用
mergeWith(merge:(key:K)
key
约束为任何可能是TProps键的东西(例如,只是
“seeds”
),而不是编写
(key:keyof TProps)
要求它完全是
按键操作
?即
“seeds”|“color”
通用的回调函数在接受哪种类型的回调函数时更为宽容,但实现起来就困难多了。(毕竟,对于
(k:k)类型的回调函数
合并
,你能做些什么=>void
对于一些你不知道的类型
K
?几乎什么都没有。你不能称之为
合并(“种子”)
,因为可能
merge
只接受
“color”
。具体的一个在接受的方面不太宽容:它需要是一个回调,既可以处理
“seeds”
,也可以处理
“color”
作为输入。这更容易实现。坦率地说,我认为问题在于您的非“损坏”接口。请注意,一般来说,仅仅因为
Y扩展了X
,并不意味着
F扩展了F
。如果您计划让
F
读取和写入类型为
t
的值,那么
F
F
通常是不相关的;您根本无法用一个替换另一个。因此“如果
Tomato
扩展了
Fruit
,那么
Wrapper
作为
Wrapper
应该起作用”只在非常特定的情况下才是正确的或安全的。不过,TypeScript通常允许在很多地方缺乏安全性,因此即使不安全,您仍然可以强制这种关系,这取决于用例。”坦白地说,我认为问题在于你没有“坏”的界面。“嗯,我明白你在这里的意思。在阅读了更多关于这个的内容后,这就更有意义了。再次感谢你的帮助!