具有启用的StrictFunctionTypes的类型检查

时间:2019-07-03 14:44:17

标签: typescript

不可能通过启用的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);

Playground

1 个答案:

答案 0 :(得分:0)

要使renderBook与各种渲染功能一起使用,同时仍在加强类型安全性,您可以将其变成通用类型:

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

但是,如果执行此操作,则会发现错误:您正在调用renderAnyBook({ a: '' }),但这仅在使用ListRenderItem<CommonBook>调用函数时才有效。例如,如果使用ListRenderItem<GoodBook>进行调用,则需要将GoodBook传递到renderAnyBook中,而{ a: '' }不是GoodBook。

从提供的信息中我可以最好地看出,这是打字稿,正在努力指出您的代码有错误。编写的函数未正确调用renderAnyBook,需要进行修改。没有更多的信息我无法告诉您确切的修改。也许您需要放松GoodBook / BadBook上的类型,以便额外的属性是可选的。