我正在尝试为原始类型创建包装器,如果指定的话,可能具有可为空的值。但遇到了一个问题: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)