Typescript强制转换函数参数类型

时间:2020-02-24 23:29:49

标签: javascript typescript

现在,我在做

function fn(arg) {
  const foo = arg as SomeType;
  ...
}

有没有一种方法可以在函数参数中进行类型转换?即类似于function fn(arg as SomeType)

以下是一个示例:

Promise.race([
  Promise.resolve(1),
  new Promise((_, fail) => {
    setTimeout(fail, 1000);
  }),
])
  .then((res: number) => {
    ...
  });

但是TS抛出:

Argument of type '(res: number) => void' is not assignable to parameter of type '(value: unknown) => void | PromiseLike<void>'.
  Types of parameters 'res' and 'value' are incompatible.
    Type 'unknown' is not assignable to type 'number'

相反,我必须这样做:

.then((temp) => {
  const res: number = temp as number;
  ...
});

3 个答案:

答案 0 :(得分:2)

TypeScript没有“类型转换”,而没有“类型断言”,因为它根本不会改变运行时行为。无法在函数参数中“强制转换”类型。但是,在开发类似以下内容时,您可以“断言” //要求它:

function fn(arg: SomeType) {
  ...
}

More info

类型断言是一种告诉编译器“相信我,我知道我在做什么”的方法。类型断言就像其他语言中的类型转换一样,但是不执行数据的特殊检查或重组。它对运行时没有影响,仅由编译器使用。 TypeScript假定您(程序员)已经执行了所需的任何特殊检查。

答案 1 :(得分:1)

在此示例中,您正在竞速Promise<number>Promise<unknown>,如果您知道第二个承诺总是失败(用于超时),则可以将其键入Promise<never>

这将确保您无法真正兑现承诺,因为_不会接受任何可能的值。

Promise.race([
  Promise.resolve(1),
  new Promise<never>((_, fail) => {
    setTimeout(fail, 1000);
  }),
])
  .then((res: number) => {
    ...
  });

答案 2 :(得分:0)

function fn(arg: SomeType) {
  ...
}

如果要确保函数返回的值恰好是所需的类型,则应将其放在参数之后,如下所示:

function fn(arg: SomeType): SomeType {
  return const foo = arg;
}

这样,您可以确保编译器在函数返回的值不是您想要的类型时告诉您。