我可能会在这里进行的方式(在没有修复或更改的情况下)接口中隐式索引签名的潜在问题 https://github.com/microsoft/TypeScript/issues/15300) 会将您想要的 json 类型表示为类似于这样的通用约束:
type AsJson<T> =
T extends string | number | boolean | null ? T :
T extends Function ? never :
T extends object ? { [K in keyof T]: AsJson<T[K]> } :
never;
So AsJson<T>
应该等于T
if T
是一个有效的 JSON 类型,否则它将有never
在它的定义中的某个地方。然后我们可以这样做:
declare function myFunc<T>(thing: T & AsJson<T>): T;
这要求thing
be T
(这推断T
为你)相交的 with AsJson<T>
,这增加了AsJson<T>
作为一个额外的限制thing
。让我们看看它是如何工作的:
myFunc(1); // okay
myFunc(""); // okay
myFunc(true); // okay
myFunc(null); // okay
myFunc(undefined); // error
myFunc(() => 1); // error
myFunc(console.log()); // error
myFunc({}); // okay
myFunc([]); // okay
myFunc([{a: [{b: ""}]}]); // okay
myFunc({ x: { z: 1, y: () => 1, w: "v" } }); // error!
// --------------> ~
// () => number is not assignable to never
现在您的接口类型已被接受:
interface SomeType {
id: string;
name: string;
}
const arrayOfSomeTypes: SomeType[] = [{ id: "A", name: "B" }];
myFunc(arrayOfSomeTypes); // okay
好的,希望有帮助。祝你好运!
链接到代码 http://www.typescriptlang.org/play/#code/C4TwDgpgBAggzgKTgewHYB4AqA+KBeKAKCikyggA9gJUATOKOYAJwEtUBzKAHylQFcAtgCMIzHlGHJkAGwgBDVBIEyZUAPykoALiIkylanQYAxfqgDGwVmg18IANzE69WwzXpRkwgFYQrdgDeUADaANJQ7FAA1hAgyABmpAC6uvBIaFjhybgAvi7E9k7MANyEhLT+MvLM0AnmVjZKgiBmlljYABTAABbsHLpkAGSwiCgYOACUg2WELW0WnQCMkyVQAPTrXtHyIHOtDZ0AREerG1vIO3vzhyz8EGeb27v7C50qMo8XV+U3lp3mSoJdgQWhfcjMZjIZivQ6dSb4XArNZPMRQmF-RYWNAoOQAOhkyA48PBaOhvwO-0CuXBlxemM6IWStJ+DJCgXkunZwl0J1yyX5LJesKpUAoumCAC9dEsADRQEC6eGIqByqAAd15DiOUHyNJRWzJzAAhIQnlAALRW602m24AB+Zq2UGVeFwAhEzlYDFQyGAUHkcDgrA4qHkwjkUGAyCKYnKhHY1GYCXkFmgAGVkIIIJhwNBAoVWLRdEw2JwyiQw9mSyx+mVcuVsagmAHIbsAPIJTPZ3OQOC6bs5vNM-ChYJF3kwI7yqsQXkAIR1-LKDJqzA7XazQ77Qr2QA