Flow - 只能由函数

时间:2017-03-29 16:20:36

标签: typescript types flowtype

使用Flow(或出于好奇心的打字稿),我可以创建一个只能由特定函数产生的类型吗?我希望能够键入一个已经被清理过的字符串,如“SanitizedString”。但是,如果我只是别名type SanitizedString = string,那么我可以为该类型分配一个非清理字符串。

所以相反,我想输入它,因此它只能来自我的sanitizeHtml()函数的返回。有谁知道这两种类型系统是否可行?

谢谢!

1 个答案:

答案 0 :(得分:2)

在Typescript中,您可以使用交集类型和"标记"接口

interface Sanitized {
    isSanitized: never;
}

type SanitizedType<T> = T & Sanitized;

function sanitizeString(str: string): SanitizedType<string> {
    return str as SanitizedType<string>;
}

function printSanitizedString(sstr: SanitizedType<string>): void {
    console.log(sstr);
}

printSanitizedString("Hello, world!"); // ERR
printSanitizedString(sanitizeString("Hello, world!")); // OK

由于我们实际上并不需要isSanitized的任何值(我们只是想要输入),因此我们将其输入为never,因此如果我们尝试用它。作为交集类型,sanitizeString(str)的返回值可用于普通字符串可用的任何位置。