小编Fla*_*rax的帖子

避免缩小到字面意思

我正在尝试为原始类型创建包装器,如果指定的话,可能具有可为空的值。但遇到了一个问题:TS自动将类型缩小为提供的值。它可以通过泛型中的手动类型规范来绕过,但对于主要用例来说它看起来有点丑陋。

class Wrapper<T> {
    constructor(
        public value: T
    ) { }
}

class StringWrapper<T extends string | null = string> extends Wrapper<T> {

}

new Wrapper(`a`); // Wrapper<string> - Perfect
new StringWrapper(`a`); // StringWrapper<'a'> - Too narrowed
new StringWrapper<string>(`a`); // StringWrapper<string> - Ugly
Run Code Online (Sandbox Code Playgroud)

是否有可能避免缩小到字面意思并使这种情况成为可能?

type TClock = `Tic` | `Tac`;

new StringWrapper(1); // TS error 
new StringWrapper(`a`); // StringWrapper<string> 
new StringWrapper<TClock>(`Tic`); // StringWrapper<TClock>
new StringWrapper<TClock | null>(null); // StringWrapper<TClock | null>
Run Code Online (Sandbox Code Playgroud)

typescript typescript-generics

7
推荐指数
1
解决办法
71
查看次数

标签 统计

typescript ×1

typescript-generics ×1