rsdoiel
rsdoiel4w ago

In Deno 2.1.7 I stumbled on Deno.Stdin, Deno.FsFile but using these types fails to pass check

I can "run" the following code it doesn't pass check or compile. What is the right way to approach this? (file is named foo.ts).
async function main () {
let input: Stdin | FsFile;
let decoder = new TextDecoder();
console.log("Reading from helloworld.txt");
// Try to read a named text file
input = await Deno.open("helloworld.txt");
for await(const chunk of input.readable) {
console.log(decoder.decode(chunk));
}
// Now try to read from standard input
console.log("Type in some text and press Ctrl-C to exit");
input = Deno.stdin;
for await(const chunk of input.readable) {
console.log(decoder.decode(chunk));
}
}

if (import.meta.main) main();
async function main () {
let input: Stdin | FsFile;
let decoder = new TextDecoder();
console.log("Reading from helloworld.txt");
// Try to read a named text file
input = await Deno.open("helloworld.txt");
for await(const chunk of input.readable) {
console.log(decoder.decode(chunk));
}
// Now try to read from standard input
console.log("Type in some text and press Ctrl-C to exit");
input = Deno.stdin;
for await(const chunk of input.readable) {
console.log(decoder.decode(chunk));
}
}

if (import.meta.main) main();
Running deno run --allow-read foo.ts works fine as does running the main function interactively in the REPL. On the other hand deno check foo.ts returns the following message. How should I be import Stdin ad FsFile to allow it to be compiled?
Check file:///C:/Users/rsdoi/Sandbox/Writing/Articles/Deno/stdin_fsfile.ts
error: TS2304 [ERROR]: Cannot find name 'Stdin'.
let input: Stdin | FsFile;
~~~~~
at file:///C:/Users/rsdoi/Sandbox/Writing/Articles/Deno/stdin_fsfile.ts:2:13

TS2552 [ERROR]: Cannot find name 'FsFile'. Did you mean 'File'?
let input: Stdin | FsFile;
~~~~~~
at file:///C:/Users/rsdoi/Sandbox/Writing/Articles/Deno/stdin_fsfile.ts:2:21

'File' is declared here.
declare var File: {
~~~~
at asset:///lib.deno.web.d.ts:622:13

Found 2 errors.
Check file:///C:/Users/rsdoi/Sandbox/Writing/Articles/Deno/stdin_fsfile.ts
error: TS2304 [ERROR]: Cannot find name 'Stdin'.
let input: Stdin | FsFile;
~~~~~
at file:///C:/Users/rsdoi/Sandbox/Writing/Articles/Deno/stdin_fsfile.ts:2:13

TS2552 [ERROR]: Cannot find name 'FsFile'. Did you mean 'File'?
let input: Stdin | FsFile;
~~~~~~
at file:///C:/Users/rsdoi/Sandbox/Writing/Articles/Deno/stdin_fsfile.ts:2:21

'File' is declared here.
declare var File: {
~~~~
at asset:///lib.deno.web.d.ts:622:13

Found 2 errors.
2 Replies
crowlKats
crowlKats4w ago
in the case of FsFile, its part of the deno namespace, so the type would be Deno.FsFile for Stdin, there is no stdin type, so you would have to do typeof Deno.stdin
rsdoiel
rsdoielOP4w ago
I changed the line let input: Stdin | FsFile; to let input: Deno.FsFile | any; The typeof(Deno.stdin) return "object" but that causes an error for lacking the readable method used later. "any" seems pretty ugly but it does work. Thanks for the help!

Did you find this page helpful?