如何在打字稿中使类型可选

时间:2017-01-26 16:39:21

标签: typescript typescript-typings

如何在Typescript中创建一些类型可选?

我有以下代码:

const A = <T>(value: T) => new Clazz(value);
const B = <U>(value: U) => new Clazz(undefined, value);

class Clazz<T, U> {
  constructor(private a?: T, private b?: U) {}

  public map<Z>(callback: (value: T) => Z): Clazz<Z, U> {
    return this.a 
      ? A(callback(this.a)) 
      : B(this.b);
  } 
}

但是此代码失败并出现错误:

Type 'Clazz<Z, {}> | Clazz<undefined, U | undefined>' is not assignable to type 'Clazz<Z, U>'. 
Type 'Clazz<Z, {}>' is not assignable to type 'Clazz<Z, U>'. 
Type '{}' is not assignable to type 'U'.

解决此问题的最佳方法是什么?

我的tsconfig.json看起来像这样:

{
  "compilerOptions": {
    "baseUrl": "",
    "declaration": true,
    "lib": ["es6", "dom"],
    "mapRoot": "./src",
    "module": "es2015",
    "moduleResolution": "node",
    "noEmitHelpers": true,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "outDir": "./dist",
    "sourceMap": true,
    "strictNullChecks": true,
    "suppressImplicitAnyIndexErrors": true,
    "target": "es2015",
    "typeRoots": [
      "./node_modules/@types"
    ]
  }
}

2 个答案:

答案 0 :(得分:1)

问题是map函数的返回类型与方法A的返回类型不匹配,因为A没有为Clazz提供预期的构造函数参数}类。您可以使用与方法B相同的解决方法,即为undefined构造函数的第二个参数传递nullClazz值:

const A = <T>(value: T) => new Clazz(value, null);
const B = <U>(value: U) => new Clazz(null, value);

class Clazz<T, U> {
  constructor(private a?: T, private b?: U|null) {}

  public map<Z>(callback: (value: T|undefined) => Z): Clazz<Z|null, U> {
    return this.a 
      ? A(callback(this.a)) 
      : B(this.b);
  } 
}

答案 1 :(得分:0)

我必须承认我很难理解你在那里做什么以及为什么 - 解释会很棒。

解决问题的一种方法是像这样参数化你的代码

const A = <T>(value: T) => new Clazz(value, null);
const B = <U>(value: U) => new Clazz(null, value);

class Clazz<T, U> {
  constructor(private a?: T, private b?: U|null) {}

  public map<Z>(callback: (value: T|undefined) => Z): Clazz<Z|null, U> {
    return this.a 
      ? A(callback(this.a)) 
      : B(this.b);
  } 
}

这可以编译,但我很难表达这张地图的作用