修复具有隐藏实现的泛型的类型兼容性

时间:2018-08-23 19:02:12

标签: typescript generics

我试图制作一个可以使用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
}

有人知道你如何解决这个问题吗?我缺少超级简单的东西吗?似乎只有函数的任何接口都会出现此问题。

1 个答案:

答案 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