我试图制作一个可以使用Maybe / Optional / Whatever类而不是null / undefined的类,但我遇到了一个奇怪的问题,即我的泛型类在技术上与任何类型都兼容。我的问题是我可以做
let a: Maybe<boolean> = Maybe.of(true);
let b: Maybe<number> = Maybe.of(1);
a = b; // No error
我知道为什么会这样。我对Maybe的定义没有任何结构可区分。 https://www.typescriptlang.org/docs/handbook/type-compatibility.html
export abstract class Maybe<T> {
abstract map<R>(mapper: (T) => R): Maybe<R>;
abstract flatMap<R>(mapper: (T) => Maybe<R>): Maybe<R>;
// nothing but abstract functions
}
class Just<T> extends Maybe<T> {
// implementation
}
class Nothing<T> extends Maybe<T> {
// implementation
}
有人知道你如何解决这个问题吗?我缺少超级简单的东西吗?似乎只有函数的任何接口都会出现此问题。
答案 0 :(得分:0)
您需要实际使用T
。例如,map
的定义实际上并未使用T
,而是声明了名为T
的参数而不是类型为T
的参数。
export abstract class Maybe<T> {
abstract map<R>(mapper: (v:T) => R): Maybe<R>;
abstract flatMap<R>(mapper: (v:T) => Maybe<R>): Maybe<R>;
// nothing but abstract functions
}
let a: Maybe<boolean>;
let b: Maybe<number>;
a = b; //error