Ошибка 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