首页 > 解决方案 > 基于数组内容的条件类型/接口

问题描述

我正在尝试创建一个基于字符串数组的接口。可以传递的字符串数量有限,并且我对所有字符串都有一个类型,然后我将它们组合到另一个数组中,如下所示:

export type firestore = 'firestore';
export type auth = 'auth';
export type database = 'database';
export type storage = 'sorage';
type tech = firestore | auth | database | storage;
export type techArray = tech[];

有了这些定义,我希望创建一个只提供较小接口/类型的接口。

export const CreateFirebaseContext = (
    firebaseConfig: firebaseConfigType,
    tech: techArray,
) => {
    type hooksCollectionType = {
        firestore: tech.includes('firestore') ? firestoreType : never, // this is the idea I'm exploring which is obviously broken; firestoreType is that smaller interface type i mentioned earlier, which I'm yet to create
        database: tech
    }
};

如果这个想法完全被打破,我很抱歉。我这样做是为了确保我不包含用于 firebase 的额外库。如果有帮助,这是我的项目回购:https ://github.com/aleksanderbrymora/firebase-hooks-react/blob/FirebaseContext/src/firebase/context/CreateFirebaseContext.ts

有问题的文件位于firebase/context/CreateFirebaseContext.ts, firebase/types/tech-array.ts.

也请原谅我很可能缺乏组织。我只是从 TS 开始,我还没有探索所有的约定。也请随时注意我这样的错误。

标签: typescriptfirebase

解决方案


TypeScript 为 JavaScript 带来的是静态分析:理解值和对象的类型,并在代码本身中捕获类型错误的能力。然后它会从你的代码中删除所有这些东西,这样你就可以使用纯 JavaScript,然后你就可以运行它了。TypeScript 最终只是添加了静态分析的 JavaScript。你不能“运行”TypeScript;编写 TypeScript 的目的是将其转编译为 JavaScript,然后运行。TypeScript 是一个编译器;它所做的一切都是在您的代码实际运行之前进行排序的。这就是 TypeScript。

也就是说:您不能根据代码的实际执行来创建动态类型,因为类型在运行时根本不存在。这根本不是它的工作原理。

我不了解您的代码中发生了什么,所以我无法告诉您应该做什么。也就是说,如果您还没有查看泛型(请参阅文档),我认为您应该。泛型允许您在调用函数时实际将类型传递给函数,让您在函数体中引用该类型,甚至在参数和返回类型中。


推荐阅读