Ошибка TypeScript 3.0 при использовании `unknown`

Здесь я тестирую TypeScript3.0 unkown тип.

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

TypeScript 3.0 представляет новый тип под названием unknown это делает именно это. Так же, как anyлюбое значение присваивается unknown; однако в отличие от any, вы не можете получить доступ к каким-либо свойствам со значениями типа unknownи вы не можете назвать / построить их. Кроме того, значения типа unknown может быть назначен только unknown или же any,

Я играю с некоторыми вещами церковного эонкодирования и тестирую 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 тип.

Благодарю.

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 
Другие вопросы по тегам