对于应用程序代码,是否建议将 Redux 存储类型放在state-slice.d.ts文件中?
我继承了一个代码库,其中所有核心类型都放置在.d.ts定义文件中,但这与我\xe2\x80\x99ve 理解定义文件的作用的方式相反。
我的理解是,定义文件适用于您\xe2\x80\x99编写库时(这是作者集中接口来定义我们向消费者公开的库的API的一个方便的地方),但不适合对于应用程序代码,因为数据可能会快速变化。
\n也就是说,我\xe2\x80\x99无法对.d.ts文件本身提出一个很好的论据 - 从功能的角度来看,我不\xe2\x80\x99t看到引用类型的区别
declare namespace Domain {\n interface State {\n // ...\n }\n} \nRun Code Online (Sandbox Code Playgroud)\n从定义文件中,或从具有以下内容的文件中显式导入文件
\nexport interface ReduxState {}\nRun Code Online (Sandbox Code Playgroud)\n添加更多上下文,因为这是一个有点特殊的问题 - I\xe2\x80\x99m 目前正在开发一个新项目,该项目需要从我继承的现有代码库中共享这些核心类型,并且 I\xe2\x80\ x99m 尝试将这些类型移至单独的包中。
\n不幸的是,我\xe2\x80\x99在导入和导出这些类型时遇到了问题 - 似乎我必须(注意 s export)
/* package A */\nexport declare namespace StateA { }\n\n/* package B */\nimport { StateA } from 'packageA/StateA' \n\nconst stateA: StateA = {};\nRun Code Online (Sandbox Code Playgroud)\n而不是 TypeScript 自动拾取它。
\n …这是一个非常基本的示例来演示我的意思:
type Payload = {
id: number;
}
type GreatPayload = {
id: number;
surprise: 4;
}
type Action = (payload: Payload) => void;
const action: Action = payload => null;
const payload: GreatPayload = {
id: 1,
surprise: 4,
};
action({ id: 1, surprise: 4 }); // <== as expected, this errors out because `surprise` is not present in `Payload`
action(payload); // <== my question is, why does this not throw an error?
Run Code Online (Sandbox Code Playgroud)
(以及可编辑示例的TypeScript 游乐场链接。)
action(payload)当 …
我想知道,两者之间是否存在差异(实际或最佳实践明智)
interface Fruit {
cost?: number;
}
Run Code Online (Sandbox Code Playgroud)
和
interface Fruit {
cost: number | undefined;
}
Run Code Online (Sandbox Code Playgroud)
如果在行为方面存在实际差异,那是什么?
如果没有,为什么会更喜欢| undefined或?:(反之亦然)?
有点困惑,因为我两者都看过,并且不确定是否真的有真正的理由让一个人更喜欢另一个,或者它是否只是归结为偏好。
谢谢!