1

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

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,也不能调用/构造它们。此外, type 的值unknown只能分配给unknownor any

我玩了一些Church 编码的东西,并测试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 中经过了很好的测试,但我只是想知道如何在不使用 type.js 的情况下解决这个错误any

谢谢。

4

1 回答 1

2

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

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 
);

当类型不仅在编写函数时未知(我们可以在其中使用常规类型)而且在调用函数时也不知道(这是我使用泛型类型参数的时候)时,我会使用unknown非常相似的类型作为最后的手段。any

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

(Right("boy") as ((x:unknown)=> unknown))("girl")  //all ok 
于 2018-07-29T15:00:12.820 回答