繁体   English   中英

打字稿、泛型和重载

[英]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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM