首页 > 解决方案 > 启用 StrictFunctionTypes 的类型检查

问题描述

启用 strictFunctionTypes 是否无法键入检查此代码?

interface CommonBook {
    a: string;
}

interface GoodBook extends CommonBook {
    b: string;
}

interface BadBook extends CommonBook {
    c: string;
}

type ListRenderItem<ItemT> = (item: ItemT) => null;

const renderBook = (renderAnyBook: ListRenderItem<CommonBook>) => renderAnyBook({ a: '' });

const renderGoodBook: ListRenderItem<GoodBook> = () => null;

renderBook(renderGoodBook);

操场

标签: typescript

解决方案


要使 renderBook 与各种渲染函数一起工作,同时仍然强制类型安全,您可以将其转换为泛型:

const renderBook = <T extends CommonBook>(renderAnyBook: ListRenderItem<T>) => 
  renderAnyBook({ a: '' });

但是,如果您这样做,您会发现一个错误:您正在调用renderAnyBook({ a: '' }),但这仅在使用 . 调用该函数时才有效ListRenderItem<CommonBook>。例如,如果使用 a 调用ListRenderItem<GoodBook>,则需要将 GoodBook 传递给 renderAnyBook,而{ a: '' }不是 GoodBook。

从提供的信息中我可以看出,这是 typescript 的工作,指出您的代码有错误。编写的函数没有正确调用 renderAnyBook,需要修改。如果没有更多信息,我无法说出确切的修改。也许您需要放松 GoodBook/BadBook 上的类型,以便额外的属性是可选的。


推荐阅读