如何使用打字稿客户端读取预取的服务器端数据?

How can I read pre-fetched server side data with a typescript client?

我正在使用以下函数来 return 初始服务器呈现的标记和数据,以防缺少 javascript 支持:

    export const serverRender = async () => {
        const { port, host } = config;
        const resp = await 
    axios.get(`http://${host}:${port}/testData.json`);

        const initialData = resp.data;
        return {
            initialMarkup: ReactDOMServer.renderToString(<App initialData={initialData} />),
            initialData,
        };
    };

我按如下方式将此数据提供给我的模板(细节并不重要):

    app.setViewEngine("pug");
    app.use(express.static(path.join(__dirname, "../public")));
    app.use(express.static(path.join(__dirname, "../assets")));
    app.enableCors();
    await app.listen(PORT, () => {
        console.log(`Nest App listening on port ${PORT}`);
    });

在我的模板中,我使用 pug 插值将 initialData 读入 javascript (window.initialData = #{initialData}) 中的 window 对象。如果我的客户是 javascript 客户,我可以像这样从 window 对象中读取:window.initialData,但 Typescript 不允许这样做。

我的问题是,传递预取数据并将其传递到客户端的最佳方式是什么? IE。所以当我呈现客户端时我可以做这样的事情:

    /* somehow grab pre-fetched data */
    ReactDOM.hydrate(<App />, document.getElementById("root")); // entry point for webpack

我并不是说这是最好的方法(这是我问这个问题的另一个原因),但在过去,对于小型纯 javascript 项目,我将数据分配给 window 如上所述,然后在我的 react 的客户端渲染中,我做了这样的事情:

    const initialData = window.initialData;
    ReactDOM.hydrate(<App initialData={initialData} />, document.getElementById("root")); // entry point for webpack

这在 Typescript 中行不通

N/a

window 案例的错误消息: Property 'initialData' does not exist on type 'Window'

但无论如何我想找到其他方法。

使用您的自定义 initialData 值声明 window 全局对象的外观:

declare global {
    interface Window { 
        initialData: any; 
    }
}

一旦你声明了这一点,那么:

const initialData = window.initialData;

应该可以。