javascript - `unknown` 用法上的 TypeScript 3.0 错误

标签 javascript typescript types functional-programming church-encoding

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

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

TypeScript 3.0 introduces a new type called unknown that does exactly that. Much like any, any value is assignable to unknown; however, unlike any, you cannot access any properties on values with the type unknown, nor can you call/construct them. Furthermore, values of type unknown can only be assigned to unknown or 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 类型的情况下解决此错误。

谢谢。

最佳答案

很简单,我认为您不应该使用 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 

关于javascript - `unknown` 用法上的 TypeScript 3.0 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51580343/

相关文章:

javascript - "UNMET PEER DEPENDENCY"尝试将 bootstrap-ui 添加到我的 Angular 时

javascript - Promise 提取返回 Promise<void | T> 而不是预期的对象

typescript - 有没有点自由的方式来做 O.alt?

scala - 具有类型变量的类型模式的用例和示例

javascript - 在 PHP 中寻找与此 JS 函数等效的函数

javascript - 与 Aurelia 的属性(property)变更订阅

javascript - 类(class)员工

types - 类型的基数

Java:参数实现的内部类中不需要的类型删除

javascript - 如何在不重绘 map 的情况下重绘标记?谷歌地图