[Breaking Change] Make 'is' type-safe.

This commit is contained in:
Bjorn Stromberg 2020-06-21 01:08:36 +09:00
parent 1ffe2fb6a7
commit b0b33a07d6
2 changed files with 23 additions and 14 deletions

View file

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

View file

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