打字稿、泛型和重载
Typescript, generics and overloading
我正在努力在 Typescript 中实现一些我想重载的函数,这些函数也使用了泛型。我对这个结果感到非常困惑:
*请注意,我已经删除了不会导致问题的代码,所以请忽略实际功能的无用性。
这个有效:
export function persistContactData<T>(
contactData: T,
callback?: () => void
): void;
export function persistContactData<T>(
{ contactData }: { contactData: T },
callback?: () => void
): void;
export function persistContactData<T>(
{ contactData }: { contactData: T },
callback?: () => void
) {
// implementation
}
这个不行(只有第一个有错误):
// *** Compile error: "This overload signature is not compatible with its implementation"
//
export function getPersistedContactData<T>(
contactId: string,
callback: (result?: T) => void
): void;
// No more errors, and if I remove the above signature everything is fine.
export function getPersistedContactData<T>(
{ contactId }: { contactId: string },
callback: (result?: T) => void
): void;
export function getPersistedContactData<T>(
{ contactId }: { contactId: string },
callback: (result?: T) => void
) {
// implementation
}
我对这里的问题感到困惑,但我在猜测通用参数的使用方式?但似乎这应该没有什么不同。
(我使用的是 Typescript 3.9.3)
编辑:我更新时没有任何未知类型
问题是泛型参数让编译器假定形状可能定义预期类型,因为实际实现将定义实际参数形状。
如果删除所有泛型并使用实际类型,则可以看到这一点。
这会起作用(但实际上可能不是预期的):
export function persistContactData<T>(
contactData: T, // <---- What is T? ┐( ̄~ ̄)┌ Could be the right shape?
callback?: () => void
): void;
export function persistContactData<T>(
{ contactData }: { contactData: T },
callback?: () => void
): void;
export function persistContactData<T>(
{ contactData }: { contactData: T },
callback?: () => void
) {
// implementation
}
这不会:
// Error
export function persistContactData(
contactData: string, // <---- string is not compatible with the implementation
callback?: () => void
): void;
export function persistContactData(
{ contactData }: { contactData: string },
callback?: () => void
): void;
export function persistContactData(
{ contactData }: { contactData: string },
callback?: () => void
) {
// implementation
}
我正在努力在 Typescript 中实现一些我想重载的函数,这些函数也使用了泛型。我对这个结果感到非常困惑:
*请注意,我已经删除了不会导致问题的代码,所以请忽略实际功能的无用性。
这个有效:
export function persistContactData<T>(
contactData: T,
callback?: () => void
): void;
export function persistContactData<T>(
{ contactData }: { contactData: T },
callback?: () => void
): void;
export function persistContactData<T>(
{ contactData }: { contactData: T },
callback?: () => void
) {
// implementation
}
这个不行(只有第一个有错误):
// *** Compile error: "This overload signature is not compatible with its implementation"
//
export function getPersistedContactData<T>(
contactId: string,
callback: (result?: T) => void
): void;
// No more errors, and if I remove the above signature everything is fine.
export function getPersistedContactData<T>(
{ contactId }: { contactId: string },
callback: (result?: T) => void
): void;
export function getPersistedContactData<T>(
{ contactId }: { contactId: string },
callback: (result?: T) => void
) {
// implementation
}
我对这里的问题感到困惑,但我在猜测通用参数的使用方式?但似乎这应该没有什么不同。
(我使用的是 Typescript 3.9.3)
编辑:我更新时没有任何未知类型
问题是泛型参数让编译器假定形状可能定义预期类型,因为实际实现将定义实际参数形状。
如果删除所有泛型并使用实际类型,则可以看到这一点。
这会起作用(但实际上可能不是预期的):
export function persistContactData<T>(
contactData: T, // <---- What is T? ┐( ̄~ ̄)┌ Could be the right shape?
callback?: () => void
): void;
export function persistContactData<T>(
{ contactData }: { contactData: T },
callback?: () => void
): void;
export function persistContactData<T>(
{ contactData }: { contactData: T },
callback?: () => void
) {
// implementation
}
这不会:
// Error
export function persistContactData(
contactData: string, // <---- string is not compatible with the implementation
callback?: () => void
): void;
export function persistContactData(
{ contactData }: { contactData: string },
callback?: () => void
): void;
export function persistContactData(
{ contactData }: { contactData: string },
callback?: () => void
) {
// implementation
}