对于界面,可以使用Partial<X>
,Mapped Type来说明&#34;允许X的所有属性,但不要期望它们#34;。
以下导致编译器错误:
interface X { foo: boolean }
function doSomething(x: Partial<X>) {
let aBoolean: boolean = x.foo; // ERROR: possibly undefined
}
doSomething({ foo: true }); // OK
doSomething({}); // OK
doSomething(true); // ERROR: Type 'boolean' has no properties in common with 'Partial<X>'
我想用any
做同样的事情来说&#34;这个函数可以接受任何参数作为参数,但是你不能指望任何东西在那里&#34;
function doSomething(x: Partial<any>) {
let aBoolean: boolean = x.foo; // OK, but I wish it wasn't
}
doSomething({ foo: true }); // OK
doSomething({}); // OK
doSomething(true); // OK
doSomething(/* etc. */); // OK
我希望我的函数接受任何东西和所有东西作为参数,但在函数内部我不能访问对象的任何属性而不先检查它们。如果函数x
内部的类型为void
或never
,则表示即可。
我并不感到惊讶Partial<any>
没有像我希望的那样工作 - 我绝对不要求&#34;为什么没有{{1}以我希望的方式工作&#34;。我问:
我可以将哪种类型用于参数Partial<any>
,以便:
x
的类型是每个属性可能未定义的(或x
类型为x
等)。答案 0 :(得分:1)
我可以使用哪种类型的参数x:
1. it accepts arguments of any/every type 2. inside the function the type of x is something where every property is possibly undefined (or x is of type void, etc.)
它是空对象类型{}
,几乎与任何类型都兼容,并允许您将几乎任何内容传递给doSomething
:
function doSomething(x?: {}) {...}
doSomething({ foo: true }); // OK
doSomething({}); // OK
doSomething(true); // OK
doSomething(/* etc. */); // OK
但是在实现中对它一无所知,如果不先检查就不能使用它:
function doSomething(x?: {}) {
//let b: boolean = x; // error
//let o: {} = x; // error when strictNullChecks in on
//let bar: string = x.foo; // error
if (typeof x === 'boolean') {
let b: boolean = x;
}
if (x !== undefined) {
if (hasProperty(ofTypeString, x, 'foo')) {
let bar: string = x.foo;
}
}
};
function hasProperty<T, N extends string>(
guard: (p: any) => p is T,
x: {},
name: N
): x is {[n in N]: T}
{
return (name in x) && guard((x as any)[name]);
}
function ofTypeString(p: any): p is string {
return typeof p === 'string'
}