Comments (2)
Would be nice to propagate some more generic typings for the cases when typescript already knows about them, either inferred/implicitly or provided/explicitly.
Note that is
(and now the associated assertions) "actively" perform type checking work at runtime. The current implicit default is that generic types resolve to unknown
1. This is a sane default, which is meant to force the user to perform further type checks before using the value. Allowing developers to define a generic type (inferred or explicit) at compile-time can hide the need to perform runtime type checks, leading to unexpected behavior. It is therefore up to developer to be aware and use explicit generics responsibly.
1 Apart from a few assertion methods where I jumped the gun in #97.
Examples
(Using a patched is
with propagated generic types for both is
and assertions.)
Works as expected when not providing an explicit T
.
(async function () {
const t = Promise.resolve("an unexpected string value");
// t is inferred at compile-time to be of type Promise<string>
assert.promise(t);
// t is (still) inferred at compile-time to be of type Promise<string>
// t is known at runtime to be a Promise resolving to an unknown type
const r = await t;
// r is inferred at compile-time to be of type string
console.log(r * 2);
// does not compile as r is not a number
}());
Showing intersection type mixup leading to unexpected behavior.
(async function () {
const t = Promise.resolve("an unexpected string value");
// t is inferred at compile-time to be of type Promise<string>
assert.promise<number>(t);
// t is inferred at compile-time to be of intersection type Promise<string> & Promise<number>
const r = await t;
// r is assumed to be of type never, which is the intersection between string and number
console.log(r * 2);
// still (unexpectedly?) compiles, but logs NaN
}());
Showing that generic types are not checked at runtime.
(async function () {
const t: unknown = Promise.resolve("an unexpected string value");
// t is inferred at compile-time to be of type unknown
assert.promise<number>(t);
// t is known at runtime to be a Promise, but is incorrectly assumed to be Promise<number> resolving to a number
const r = await t;
// r is assumed to be of type number
console.log(r * 2);
// logs NaN
}());
(Sidenote: if the resolved string would have been implicitly castable by the javascript runtime to a number, such as "1234"
, the multiplication would actually work at runtime.)
Allowing developers to provide their own generic types would be a nice improvement, but guess it needs a disclaimer about potential compile-time/runtime discrepancies. If it's considered too risky, so to speak, I'd be happy to remove the generics introduced in #97.
from is.
Fixed by #103
from is.
Related Issues (20)
- Property 'function' does not exist on type 'typeof is'. HOT 1
- Proposal: is.nonEmptyStringAndNotWhitespace(value) HOT 10
- [v5] Better handling of `NaN`
- test code perf HOT 1
- Can't access default export properties when `moduleResolution: 'NodeNext'` HOT 3
- Add is.renderInReact or is.notRenderInReact HOT 1
- Question: What is the reason Node.js below version 14.16 is not supported? HOT 2
- add type inference to "nonEmptyArray"
- Confused between class_ docs and implementation HOT 1
- How to shorten: `"prop" in obj && obj.prop`
- Improve type narrowing for `nonEmptyArray` HOT 1
- is.numericString type guarding returns `x is string` and messes up typescript HOT 4
- Parcel JS build issue - No Main HOT 1
- v5.4.0 "Cannot find module '@sindresorhus/is' or its corresponding type declarations" HOT 4
- `plainObject` is incompatible with `structuredClone` HOT 2
- Some type guards under assert are not working HOT 1
- directInstanceOf(instance, class) throws error if instance is null or undefined HOT 1
- Struggling to configure jest to compile `is` HOT 1
- is.enumCase method is not a type guard HOT 2
- Typing errors with the isEmptyStringOrWhitespace type guard HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from is.