如何从类型初始化BehaviorSubject?

时间:2019-05-10 11:06:02

标签: typescript typescript2.0

我有一个自定义类型dictionaryItemLanguage

type dictionaryItemLanguage = Map<string, Map<string, IDictItem>>;

我需要像这样初始化BehaviorSubject

export const Dictionary: BehaviorSubject<dictionaryItemLanguage> = new BehaviorSubject(new Map<string, Map<string, IDictItem>>());

但替换为dictionaryItemLanguage

export const Dictionary: BehaviorSubject<dictionaryItemLanguage> = new BehaviorSubject(new dictionaryItemLanguage());

在TypeScript中可以吗?我尝试过DRY。

1 个答案:

答案 0 :(得分:2)

首先,我在这里看到的是您尝试在语句中使用type作为类/构造函数,这是行不通的:

export const Dictionary: BehaviorSubject<dictionaryItemLanguage> = new BehaviorSubject(new dictionaryItemLanguage());

第一个语句将起作用,因为您可以使用现有的Map类

export const Dictionary: BehaviorSubject<dictionaryItemLanguage> = new BehaviorSubject(new Map<string, Map<string, IDictItem>>());

别忘了在编译步骤之后所有打字稿内容都会消失,并且类型和接口不能编译成任何东西,请检查一下自己

https://www.typescriptlang.org/play/index.html#src=interface%20IDictItem%20%7B%0D%0A%20%20%20%20value%3A%20string%3B%0D%0A%7D%0D%0A%0D%0Atype%20dictionaryItemLanguage%20%3D%20Map%3Cstring%2C%20Map%3Cstring%2C%20IDictItem%3E%3E%3B

如果要使用新运算符,则至少要创建类。

如果您只想让BehaviorSubject与您的dictionaryItemLanguage类型的项一起使用,并且每次都想避免使用新的Map>()语句,我可以建议:

interface IDictItem {
    value: string;
}

type dictionaryItemLanguage = Map<string, Map<string, IDictItem>>;

const createDictionary: () => dictionaryItemLanguage = () => {
    return new Map<string, Map<string, IDictItem>>();
};

const dictionary = new BehaviorSubject<dictionaryItemLanguage>(createDictionary());
dictionary.getValue();

这里有一个函数,该函数将始终返回先前定义的类型dictionaryItemLanguage的新Map,返回值dictionary.getValue(); 将会是Map<string, Map<string, IDictItem>>dictionaryItemLanguage,因为type只是类型别名。