在这里,我测试TypeScript3.0 unkown
类型。
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")
~~~~~~~~~~~~
以防万一,这已经在香草JS中经过了很好的测试,但是我只是想知道如何在不使用any
类型的情况下解决此错误。
谢谢。
答案 0 :(得分: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
);
我会像unknown
那样使用any
作为最后的求助类型,这不仅是在编写函数时未知(我们可以使用常规类型),而且在调用函数时是未知的(这是我要泛型类型参数的时间。
如果由于某种原因,泛型不可行,则解决此问题的唯一方法是使用类型声明,因为您掌握了在这种情况下丢失的类型系统的信息:
(Right("boy") as ((x:unknown)=> unknown))("girl") //all ok