问题似乎特定于
问题仅在
如果
如果没有太多的
如果
在这种情况下,严格的
strictFunctionTypes
如何影响泛型类类型。
这里有一个类,它紧密地复制了发生的事情,并且由于要求无法进一步简化,any
用于指定不会添加额外限制的部分(一个playground):
class Foo<T> {
static manyFoo(): Foo<any[] | { [s: string]: any }>;
static manyFoo(): Foo<any[]> {
return ['stub'] as any;
}
barCallback!: (val: T) => void;
constructor() {
// get synchronously from elsewhere
(callback => {
this.barCallback = callback;
})((v: any) => {});
}
baz(callback: ((val: T) => void)): void {}
}
barCallback
签名中的泛型类型 T
导致类型错误:
(method) Foo<T>.manyFoo(): Foo<any[]>
This overload signature is not compatible with its implementation signature.(2394)
问题仅在
barCallback
函数类型中将T
用作val
类型时出现。如果
barCallback
或baz
不使用T
作为参数类型,则问题消失:barCallback!: (val: any) => void | T;
如果没有太多的
manyFoo
方法重载或签名不够多样化,它就会消失。如果
barCallback
在类中具有方法签名,则不会出现,但这将防止以后对其进行分配。barCallback!(val: T): void;
在这种情况下,严格的
val
类型并不是必要的,可以被牺牲。由于barCallback
不能用类中的方法签名替换,接口合并似乎是一种抑制错误而不进一步放宽类型的方法:interface Foo<T> {
barCallback(val: T): void;
}
在类似情况下是否有其他可行的解决方法?
我希望能够解释为什么函数类型中的val:T
会以这种方式影响类类型。
barCallback
不能被方法签名所替代?https://www.typescriptlang.org/play?#code/MYGwhgzhAEBiD28A8AVAfNA3gKGn6EALmIQJbDQC2YAdgJ4LwAUAlAFxyJK10DaAutAA+WaLwgciAJ1I0A5vw49oAXzQBuXPiIlyVHo1YdG3egIw58V6FICmhAK5SaYgOREHAI1eDI0HppWKthaeJ5gUgDCYCAg4cAA1gD8TABuMRwo7NCp8KQAJpqh0MDwNNIOwITwUqxYxVYA9I0AdG0N2vYopJS28A6ETHUAvBYd1tCEABakEC3hUTFxYInQw9BpLGsWKoETqix7eMHF4QBeTMBL8QkcQ+kgmVujOXn5LNm5BVjBJ6XlhH8a2gNFsAHdOMwWNgwPMItFYjdgSMdkA - Aleksey L.barCallback!
并且在同步设置中进行,只是不在构造函数范围内。 - Estus Flask