使用Flow(或出于好奇心的打字稿),我可以创建一个只能由特定函数产生的类型吗?我希望能够键入一个已经被清理过的字符串,如“SanitizedString”。但是,如果我只是别名type SanitizedString = string
,那么我可以为该类型分配一个非清理字符串。
所以相反,我想输入它,因此它只能来自我的sanitizeHtml()
函数的返回。有谁知道这两种类型系统是否可行?
谢谢!
答案 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)的返回值可用于普通字符串可用的任何位置。