Closed
Labels
DeclinedThe issue was declined as something which matches the TypeScript visionThe issue was declined as something which matches the TypeScript visionDomain: lib.d.tsThe issue relates to the different libraries shipped with TypeScriptThe issue relates to the different libraries shipped with TypeScriptSuggestionAn idea for TypeScriptAn idea for TypeScript
Description
TypeScript Version: 2.5.0-dev.20170629
Watch this code with a new version of hasOwnProperty:
function hasOwnProperty<T, K extends keyof T>(object: T, key: string): key is K {
return object.hasOwnProperty(key);
}
const x = {
a: "a",
b: "b",
};
// Ensure k is unknown for the transpiler:
const k = String.fromCharCode("a".charCodeAt(0) + 1);
// This is working without any problem.
if (hasOwnProperty(x, k)) {
x[k] = "anything";
}
// This blames: file: 'Element implicitly has an 'any' type because type '{ a: string; b: string; }' has no index
if (x.hasOwnProperty(k)) {
x[k] = "anything";
}
// This emits the same error:
if (k in x) {
x[k] = "anything";
}Suggestion:
Change the actual declaration of hasOwnProperty:
hasOwnProperty(v: PropertyKey): boolean;With a new one type guarded:
hasOwnProperty<T, K extends keyof T>(this: T, key: string): key is K;Something that also could be added is a type guard to in operator to work as the type guard of the suggested hasOwnProperty .
Reacted by Aluan Haddad
Metadata
Metadata
Assignees
Labels
DeclinedThe issue was declined as something which matches the TypeScript visionThe issue was declined as something which matches the TypeScript visionDomain: lib.d.tsThe issue relates to the different libraries shipped with TypeScriptThe issue relates to the different libraries shipped with TypeScriptSuggestionAn idea for TypeScriptAn idea for TypeScript
Activity
mhegazy commentedon Sep 6, 2017
you do not need the
Ktype parameter. a simplified version would be:mhegazy commentedon Sep 6, 2017
The use of
inis tracked by #10485mhegazy commentedon Sep 6, 2017
similar discussion can be found in #12253 (comment)
DanielRosenwasser commentedon Sep 6, 2017
This really isn't appropriate. At runtime, your object might have more keys than
Tdescribes, so the sort of information you're trying to convey to the type system wouldn't be true.There are two things that this function gives information about:
xof typeTalso has a property keyK(i.e. x is T & Record<K, any>).xof typeTthat has an optionally defined key of typeU(i.e.T extends Partial<Record<K, U>>) actually has that property defined (i.e.x is T & Record<K, U>).