Make the is() function type-safe (#117)

This commit is contained in:
Bjorn Stromberg 2020-06-28 05:20:36 +09:00 committed by GitHub
parent a96abee1a3
commit 71ca1e5573
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 13 deletions

View file

@ -66,6 +66,10 @@ const objectTypeNames = [
type ObjectTypeName = typeof objectTypeNames[number]; type ObjectTypeName = typeof objectTypeNames[number];
function isObjectTypeName(name: unknown): name is ObjectTypeName {
return objectTypeNames.includes(name as ObjectTypeName);
}
const primitiveTypeNames = [ const primitiveTypeNames = [
'null', 'null',
'undefined', 'undefined',
@ -100,9 +104,14 @@ function isOfType<T extends Primitive | Function>(type: PrimitiveTypeName | 'fun
const {toString} = Object.prototype; const {toString} = Object.prototype;
const getObjectType = (value: unknown): ObjectTypeName | undefined => { const getObjectType = (value: unknown): ObjectTypeName | undefined => {
const objectName = toString.call(value).slice(8, -1); const objectTypeName = toString.call(value).slice(8, -1);
if (objectName) {
return objectName as ObjectTypeName; if (/HTML\w+Element/.test(objectTypeName) && is.domElement(value)) {
return 'HTMLElement';
}
if (isObjectTypeName(objectTypeName)) {
return objectTypeName;
} }
return undefined; return undefined;

View file

@ -1275,18 +1275,18 @@ test('is.domElement', t => {
assert.domElement({nodeType: 1, nodeName: 'div'}); assert.domElement({nodeType: 1, nodeName: 'div'});
}); });
const htmlTagNameToTypeName = { const tagNames = [
div: 'HTMLDivElement', 'div',
input: 'HTMLInputElement', 'input',
span: 'HTMLSpanElement', 'span',
img: 'HTMLImageElement', 'img',
canvas: 'HTMLCanvasElement', 'canvas',
script: 'HTMLScriptElement' 'script'
}; ];
for (const [tagName, typeName] of Object.entries(htmlTagNameToTypeName)) { for (const tagName of tagNames) {
const domElement = createDomElement(tagName); const domElement = createDomElement(tagName);
t.is(is(domElement), typeName); t.is(is(domElement), 'HTMLElement');
} }
}); });