[Breaking Change] Make 'is' type-safe.
This commit is contained in:
parent
1ffe2fb6a7
commit
b0b33a07d6
2 changed files with 23 additions and 14 deletions
|
|
@ -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;
|
||||
|
|
|
|||
22
test/test.ts
22
test/test.ts
|
|
@ -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 => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue