如何在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"
]
}
}
答案 0 :(得分:1)
问题是map
函数的返回类型与方法A
的返回类型不匹配,因为A
没有为Clazz
提供预期的构造函数参数}类。您可以使用与方法B
相同的解决方法,即为undefined
构造函数的第二个参数传递null
或Clazz
值:
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);
}
}
这可以编译,但我很难表达这张地图的作用