【问题标题】:TypeScript 3.0 error on `unknown` usage`unknown` 用法上的 TypeScript 3.0 错误
【发布时间】:2019-01-05 21:35:57
【问题描述】:

这里,我测试 TypeScript3.0 unkown 类型。

https://blogs.msdn.microsoft.com/typescript/2018/07/12/announcing-typescript-3-0-rc/#the-unknown-type

TypeScript 3.0 引入了一种名为 unknown 的新类型,它正是这样做的。很像any,任何值都可以分配给unknown;但是,与any 不同,您不能访问类型为unknown 的值的任何属性,也不能调用/构造它们。此外,unknown 类型的值只能分配给unknown 或any。

我玩了一些Church eoncoding 的东西,并对函数的每个参数测试unknown 类型,我有一个错误如下:

const log = (m: unknown) => {
    console.log(m); //IO
    return m;
};

const I = (x:unknown) => x;
const L = (x:unknown) => (y:unknown) => x;
const P = (x:unknown) => (y:unknown) => (z:Function) => z(x)(y);
//z is a binary operator Function!

const Left = L;
const Right = L(I);

log("Left Right test---------");
log(
    Left("boy")("girl")  // boy
);
log(
    Right("boy")("girl")  //TypeScript Type Error here
);

错误:

church.ts:20:9 - error TS2571: Object is of type 'unknown'.

20         Right("boy")("girl")
           ~~~~~~~~~~~~

以防万一,这在 vanilla JS 中经过了很好的测试,但我只是想知道如何在不使用 any 类型的情况下解决此错误。

谢谢。

【问题讨论】:

  • 您期待不同的东西吗? L(I)("boy") 的结果类型为 unknown,并且您在引用中明确包含此类类型的状态“您也无法调用/构造它们”。
  • 你能澄清哪些引用说明了这些类型“你也不能调用/构造它们”。
  • ...字面意思是您在问题中发布的黄色框中的那个。
  • @jonrsharpe ,谢谢,问题不是我所期望的,但我只是想知道如何在不使用任何类型的情况下解决此错误。

标签: javascript typescript types functional-programming church-encoding


【解决方案1】:

这里很简单,我认为您不应该使用unknown,而应该使用通用函数,因为L 的参数与最终返回类型之间存在明显的关系:

const I = (x:unknown) => x;
const L = <T>(x:T) => (y:unknown) => x;

const Left = L;
const Right = L(I); 

log("Left Right test---------");
log(
  Left("boy")("girl")  // boy
);
log(
  Right("boy")("girl")  //all ok 
);

当类型不仅在编写函数时未知(我们可以使用常规类型)而且在调用函数时也不知道时(这是我将泛型类型参数)。

如果由于某种原因泛型不可行,解决此问题的唯一方法是使用类型断言,因为您知道在这种情况下类型系统丢失的信息:

(Right("boy") as ((x:unknown)=> unknown))("girl")  //all ok 

【讨论】:

  • 再次感谢!事实上,正如我在上一篇文章中提到的那样,我正在寻找一种尽可能避免泛型的可能性,并想知道unknown 在这个打字世界中的表现如何:) 事实上,我有点成功了,请查看我自己的答案stackoverflow.com/a/51581887/6440264,我很高兴听到你的想法。
  • @bayesian-study 不要回避泛型,拥抱它们! :) 它们在打字稿类型系统中是必不可少的。 unknown 可能会在某些特定情况下提供类似的结果,但肯定不是全部。
猜你喜欢
  • 1970-01-01
  • 2021-06-08
  • 2019-01-05
  • 2022-06-12
  • 1970-01-01
  • 2017-12-23
  • 2019-07-24
  • 2019-11-28
  • 2020-07-29
相关资源
最近更新 更多