打字稿:强制使用内部类型,但返回实际类型

时间:2019-03-13 11:22:44

标签: typescript types return-type typing

我有以下代码:

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可以进行酷炫的演绎?

2 个答案:

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