我有以下代码:
class ValueGetter {
getValues() {
return {
value1: this.getValueAsBoolean(somewhere.something),
value2: this.getValueAsBoolean(somewhere.somethingElse)
}
}
}
Typescript知道函数的确切返回类型。
{
value1: boolean,
value2: boolean
}
我什至可以在其他地方执行以下操作真的很方便:
class MyFoo {
myBar: ReturnType<ValueGetter['getValues']>
}
现在我要执行的是getValues
,因此它只能返回以下类型的{[key: string]: boolean}
但是,如果我将其添加为getValues()
的返回类型,则会使用Typescript为我推断出的命名键来释放确切的返回类型。
是否有一种方法可以仅对getValues
的“内部”强制执行此键入操作,而不用“命名键”-返回类型的Typescript可以进行酷炫的演绎?
答案 0 :(得分:2)
即使回答了这个问题,这也是在不增加任何运行时开销的情况下完成所需操作的更好方法:
type HasType<T extends C, C> = T;
function getValues() {
let foo = {
value1: Boolean(100),
value2: 123
};
return <HasType<typeof foo, Record<string, boolean>>>foo;
// ^^^^^^^^^^ error here
}
这里是demo
(如果您认为这样更好,也可以考虑将其标记为接受)
答案 1 :(得分:1)
这是一个普遍的问题,要求强制值满足特定约束,但同时保留值的实际类型。
不幸的是,打字稿对此不支持任何特殊语法。您能做的最好的事情就是拥有一个带有带有约束的类型参数的函数。将根据传入的实际值推断类型,但将根据约束条件对其进行检查:
$ bash -help
GNU bash, version 4.4.23(1)-release-(x86_64-pc-msys)
$ bc
bash: bc: command not found
您甚至可以泛化该函数:
class ValueGetter {
getValues() {
return constrainToBooleanValues({
value1: true,
value2: false,
worngValue: 1// err
})
}
}
function constrainToBooleanValues<T extends Record<string, boolean>>(o: T) {
return o;
}