【问题标题】:Flow - A type that can only result from a functionFlow - 只能由函数产生的类型
【发布时间】:2017-08-09 02:57:55
【问题描述】:

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

因此,我想输入它,因此它只能来自我的sanitizeHtml() 函数的返回。有谁知道这在任一类型系统中是否可行?

谢谢!

【问题讨论】:

    标签: typescript types flowtype


    【解决方案1】:

    在 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) 的返回值适用于普通字符串可用的任何地方。

    【讨论】:

    • 这看起来有点老套,而且意图不透明,但它可以完美地完成工作。很棒的作品!
    • 是的。在实际代码中,您可能应该使用 sanitize 函数返回的包装对象,例如 type SanitizedString = { value: string }。这意味着您必须在使用时打开它,但它更好地表达了意图。
    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2015-06-27
    • 2019-03-23
    • 1970-01-01
    • 2021-09-16
    相关资源
    最近更新 更多